Maë*_*son 5 parsing generator lemon
当语法错误发生时,是否有一种已知的方法来生成"预期令牌"列表?我使用Lemon作为解析器生成器.
小智 9
这似乎有效:
%syntax_error {
int n = sizeof(yyTokenName) / sizeof(yyTokenName[0]);
for (int i = 0; i < n; ++i) {
int a = yy_find_shift_action(yypParser, (YYCODETYPE)i);
if (a < YYNSTATE + YYNRULE) {
printf("possible token: %s\n", yyTokenName[i]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它会尝试所有可能的令牌并打印适用于当前解析器状态的令牌.
请注意,当出现错误的令牌时,解析器不会立即调用syntax_error,但它会尝试减少堆栈上的内容,希望之后可以移动令牌.只有当其他任何东西都无法减少且当前令牌无法移动时,解析器才会调用syntax_error.减少将改变解析器状态,这意味着您可能会看到比减少之前适用的令牌更少的令牌.但它应该足以进行错误报告.
归档时间: |
|
查看次数: |
1065 次 |
最近记录: |