This is a parser for λ-calculus expressions. It takes a λ-terms as input, parses it and returns a JSON representation of the term. The parser currently supports λ-abstractions, variables and function applications. It uses a recursive descent parsing technique.
- Parses λ-abstractions, variables and function applications
- Returns a JSON representation of the parsed λ-term
- Includes a REPL for interactive parsing
The parser is implemented as a Parser struct with several methods. It uses a Peekable<Chars> iterator to read the input string single characters at a time. The main parsing function, parse_term, loop over the input string and determine the appropriate parsing function to call based on the current character.
The parsing functions are:
parse_lambda: Parsed a λ-abstraction(e.g.,λx.x)parse_application: Parses a function application (e.g.,(f x))parse_variable: Parses a variable (e.g.,x)
The parser returns an enum Term, which can be one of the following:
Lambda: Represents a λ-abstraction with a binding variable and a bodyApplication: Represents a function application with a function and an argumentVariable: Represents a variable with a nameNull: Represents an empty term or failed parsing
The parsed Term is then converted to a JSON format using the term_to_json function. which converts the Term to a serde_json::Value object.
Here's an example of how to parse a λ-term using the parser:
fn main() {
let input = "λf. λx. (f x)";
let term = parse(input);
let json = term_to_json(&term);
println!("{}", serde_json::to_string_pretty(&json).unwrap());
}This will output:
{
"bind": "f",
"body": {
"bind": "x",
"body": {
"arg": {
"name": "x",
"tag": "var"
},
"func": {
"name": "f",
"tag": "var"
},
"tag": "application"
},
"tag": "lambda"
},
"tag": "lambda"
}Note: There is a problem that the position of the tag goes down when print the current JSON. This will be fixed in the future.
To use the REPL, run the following command:
cargo runAfter that, you can enter a λ-term and press enter to parse it. The REPL will print the parsed JSON representation of the term.