解析基础

现在我们要开始建立抽象语法树了。我们先试着解析x+y这样的表达式,这可以由这样的调用产生。

  1. ExprAST *X = new VariableExprAST("x");
  2. ExprAST *Y = new VariableExprAST("y");
  3. ExprAST *Result = new BinaryExprAST('+', X, Y);

为了达到上面的目的,我们现在还需要以下的辅助函数

  1. /// CurTok/getNextToken - Provide a simple token buffer. CurTok is the current
  2. /// token the parser is looking at. getNextToken reads another token from the
  3. /// lexer and updates CurTok with its results.
  4. static int CurTok;
  5. static int getNextToken() {
  6. return CurTok = gettok();
  7. }

以上实现了一个简单的token缓存,这使得我们可以向前读取下一个token,每一个解析器的函数将默认CurTok是当前正在被解析的token。

  1. /// Error* - These are little helper functions for error handling.
  2. ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
  3. PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
  4. FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }

错误处理函数将用来处理简单的错误。我们的解析器的错误恢复并不是最好的,也不是特别的方便,但对于我们的教程来说已经够了。这些程序可以让我们更容易地处理不同的返回类型程序的错误,在一般情况下一般返回NULL

具备好了这些基础的辅助函数,我们可以实现我们的第一个语法:解析数字。