解析基础
现在我们要开始建立抽象语法树了。我们先试着解析x+y
这样的表达式,这可以由这样的调用产生。
- ExprAST *X = new VariableExprAST("x");
- ExprAST *Y = new VariableExprAST("y");
- ExprAST *Result = new BinaryExprAST('+', X, Y);
为了达到上面的目的,我们现在还需要以下的辅助函数
- /// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
- /// token the parser is looking at. getNextToken reads another token from the
- /// lexer and updates CurTok with its results.
- static int CurTok;
- static int getNextToken() {
- return CurTok = gettok();
- }
以上实现了一个简单的token缓存,这使得我们可以向前读取下一个token,每一个解析器的函数将默认CurTok
是当前正在被解析的token。
- /// Error* - These are little helper functions for error handling.
- ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
- PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
- FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }
错误处理函数将用来处理简单的错误。我们的解析器的错误恢复并不是最好的,也不是特别的方便,但对于我们的教程来说已经够了。这些程序可以让我们更容易地处理不同的返回类型程序的错误,在一般情况下一般返回NULL
。
具备好了这些基础的辅助函数,我们可以实现我们的第一个语法:解析数字。