Advertisement
Yevano

Untitled

Mar 18th, 2019
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.55 KB | None | 0 0
  1. static void skip_whitespace(TextReader reader) {
  2.     while(Char.IsWhiteSpace((char) reader.Peek())) reader.Read();
  3. }
  4.  
  5. static AST parse_application(TextReader reader) {
  6.     skip_whitespace(reader);
  7.     var asts = new List<AST>();
  8.  
  9.     while(!(reader.Peek() == -1 || ((char) reader.Peek()) == ')')) {
  10.         asts.Add(parse_term(reader));
  11.         skip_whitespace(reader);
  12.     }
  13.  
  14.     if(asts.Count == 0) return null;
  15.  
  16.     if(asts.Count == 1) return asts[0];
  17.  
  18.     return A(asts.ToArray());
  19. }
  20.  
  21. static AST parse_term(TextReader reader) {
  22.     var c = (char) reader.Peek();
  23.  
  24.     switch(c) {
  25.         case '/':
  26.             return parse_abstraction(reader);
  27.         case '(':
  28.             reader.Read();
  29.             var res = parse_application(reader);
  30.             reader.Read(); // Read ')'
  31.             return res;
  32.         default:
  33.             return parse_variable(reader);
  34.     }
  35.  
  36.     throw new Exception("Tried to parse invalid term.");
  37. }
  38.  
  39. static AST parse_abstraction(TextReader reader) {
  40.     reader.Read();
  41.  
  42.     skip_whitespace(reader);
  43.     var variable = parse_variable(reader);
  44.  
  45.     skip_whitespace(reader);
  46.     reader.Read(); // TODO: Check for '.'
  47.     skip_whitespace(reader);
  48.  
  49.     var body = parse_application(reader);
  50.  
  51.     return new AbstractionAST(variable, body);
  52. }
  53.  
  54. static VariableAST parse_variable(TextReader reader) {
  55.     var builder = new StringWriter();
  56.    
  57.     while(Char.IsLetterOrDigit((char) reader.Peek())) {
  58.         builder.Write((char) reader.Read());
  59.     }
  60.  
  61.     return new VariableAST(builder.ToString());
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement