使用柠檬解析器生成器的"预期令牌"

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.减少将改变解析器状态,这意味着您可能会看到比减少之前适用的令牌更少的令牌.但它应该足以进行错误报告.

  • 正是我要求的!但是,您忘记了'yypParser'作为yy_find_shift_action的第一个参数:) (2认同)