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