Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void skip_whitespace(TextReader reader) {
- while(Char.IsWhiteSpace((char) reader.Peek())) reader.Read();
- }
- static AST parse_application(TextReader reader) {
- skip_whitespace(reader);
- var asts = new List<AST>();
- while(!(reader.Peek() == -1 || ((char) reader.Peek()) == ')')) {
- asts.Add(parse_term(reader));
- skip_whitespace(reader);
- }
- if(asts.Count == 0) return null;
- if(asts.Count == 1) return asts[0];
- return A(asts.ToArray());
- }
- static AST parse_term(TextReader reader) {
- var c = (char) reader.Peek();
- switch(c) {
- case '/':
- return parse_abstraction(reader);
- case '(':
- reader.Read();
- var res = parse_application(reader);
- reader.Read(); // Read ')'
- return res;
- default:
- return parse_variable(reader);
- }
- throw new Exception("Tried to parse invalid term.");
- }
- static AST parse_abstraction(TextReader reader) {
- reader.Read();
- skip_whitespace(reader);
- var variable = parse_variable(reader);
- skip_whitespace(reader);
- reader.Read(); // TODO: Check for '.'
- skip_whitespace(reader);
- var body = parse_application(reader);
- return new AbstractionAST(variable, body);
- }
- static VariableAST parse_variable(TextReader reader) {
- var builder = new StringWriter();
- while(Char.IsLetterOrDigit((char) reader.Peek())) {
- builder.Write((char) reader.Read());
- }
- return new VariableAST(builder.ToString());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement