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