Parsing 为Scheme EBNF语法编写解析器

Parsing 为Scheme EBNF语法编写解析器,parsing,compiler-construction,scheme,Parsing,Compiler Construction,Scheme,我目前正在为一个scheme子集编写自己的编译器,但我自己的递归下降语法分析器有问题。我正在使用此处找到的chez方案语法:。问题来自星号和加号。因为星号基本上表示ε规则,所以我需要检查以下标记是否合法,或者允许被调用的非终端方法失败并且不返回任何内容。我采用第二种方法,使用向量保存可能需要恢复的令牌 例如: 注意:构建AST的代码仍然缺失 bool Parser::definition() { if (variableDefinition()){ consumeTT(); // c

我目前正在为一个scheme子集编写自己的编译器,但我自己的递归下降语法分析器有问题。我正在使用此处找到的chez方案语法:。问题来自星号和加号。因为星号基本上表示ε规则,所以我需要检查以下标记是否合法,或者允许被调用的非终端方法失败并且不返回任何内容。我采用第二种方法,使用向量保存可能需要恢复的令牌

例如:

注意:构建AST的代码仍然缺失

bool Parser::definition() {
  if (variableDefinition()){
    consumeTT(); // consumeTemporaryTokens
    return true;
  }
  if (derivedDefinition()){
    consumeTT();
    return true;
  }

  if (checkNext(Tag::LPAR)) {
    if (checkNext(Tag::BEGIN)) {
      while (definition())
        ;
      consumeTT();
      return true;
    }
  }
  restoreTT(); //restoreTemporaryTokens
  return false;
}


这是正确的方法吗?既然基本上任何规则都可能失败,那么我现在应该如何处理错误呢

我想这就是为什么我建议使用第一种方法(检查下一个标记是否在FOLLOW集合中)。通常,当您完成编译器时,调用
(read)
就足够了。请告诉我们您是如何实现尾部递归的。关于您的问题,kleene运算符的语义如下:。kleene运算符也可以在没有ε规则的情况下实现。