【发布时间】:2019-11-09 15:57:43
【问题描述】:
我有一个lex 文件,里面有我的规则,例如:
PROGRAM return Parser::PROGRAM;
PROGRAM_END return Parser::PROGRAM_END;
VARIABLES: return Parser::VARIABLES;
INSTRUCTIONS: return Parser::INSTRUCTIONS;
SKIP return Parser::SKIP;
. {
std::cerr << lineno() << ": ERROR." << std::endl;
exit(1);
}
当我尝试使用完全编译的(使用yacc 文件等)版本时,即使测试文件正确,也仅在测试文件上使用最后一条规则。
例如,这是这些规则的测试文件:
PROGRAM fst
INSTRUCTIONS:
SKIP
PROGRAM_END
对于这个文件,我只得到:1: ERROR。
为什么会这样,我该如何解决?
【问题讨论】:
-
您的输入不包含
<、<=或>,您错了只使用了最后一条规则,或者您的真实代码中发生了其他事情这在您发布的摘录中不可见。没有看到minimal reproducible example就不可能说出来。 -
@sepp2k 我用一个例子和这个例子的必要规则更新了我的问题。
-
你怎么知道
PROGRAM规则在那个例子中没有运行?如果您在该规则中添加一条打印语句,我相信您会看到它的输出。无论如何,如果您希望它仍然对包含未知字符的输入执行某些操作(除了退出并显示错误消息),您可能不应该在未知字符上退出程序。我还建议在.-rule 中打印有问题的输入。 -
@sepp2k 我知道,因为
yacc文件应该打印每个被捕获的规则。如果我用YYText()打印,那么什么也没有:1: ERROR: -
如果您在
.规则中打印违规字符,您可能会发现。我无法告诉您真实代码中缺少哪些规则,因为我没有看到您的真实代码,但我可以告诉您,在您的示例中,第一个未知字符将是PRORGAM和fst之间的空格。
标签: regex bison yacc lex bisonc++