规则具有相同的字符串标记两次
问题描述:
使用YACC,我想分析的文字像规则具有相同的字符串标记两次
begin foo ... end foo
字符串foo
在编译时已知有可以在相同的输入不同 这样的字符串。
到目前为止,我看到的唯一选择是解析后检查没有语法错误:
block : BEGIN IDENT something END IDENT
{ if (strcmp($2, $5) != 0) yyerror("Mismatch"); }
这种感觉是错误的。解析器应该已经检测到错误。 yacc有内置的东西吗?
答
yacc只知道词法分析器可以识别的标记。由于这些是相同的,词法分析器只能通过使用状态来改善这种情况。
也就是说,您可以告诉lex记住它看到了一个BEGIN
并计数令牌本身,并返回不同类型的IDENT
(并在那里执行检查)。
然而,yacc更适合这种事情,所以对原始问题的答案是“否”,没有更好的解决方案。