public AST Parse(IEnumerable <string> tokens) { _lexer = new Lexer(tokens); if (_lexer.CurrentToken.Type == TokenType.EOF) { return(null); } var tree = _lexer.CurrentToken.Value.ToLower() == "fn" ? ParseFnDef() : ParseExpr(); _lexer.AcceptToken(TokenType.EOF); return(tree); }
private AST ParseFnDef() { _lexer.AcceptToken(TokenType.Identifier); var fName = _lexer.CurrentToken.Value; _lexer.AcceptToken(TokenType.Identifier); var formalParams = new List <string>(); while (_lexer.CurrentToken.Type == TokenType.Identifier) { formalParams.Add(_lexer.CurrentToken.Value); _lexer.AcceptToken(TokenType.Identifier); } _lexer.AcceptToken(TokenType.FnBodyDef); var body = ParseExpr(formalParams); var fnDef = new FnDefAST(fName, formalParams, body); Context.AddDef(fName, fnDef); return(fnDef); }