使用相同的字符串标记规则两次

Rule with identical string token twice

使用yacc,我想像这样解析文本

begin foo ... end foo

字符串foo在编译时是未知的,可以有不同的 相同输入中的此类字符串。

到目前为止,我看到的唯一选择是在解析后检查语法正确性:

block : BEGIN IDENT something END IDENT 
        { if (strcmp(, ) != 0) yyerror("Mismatch"); }

这感觉不对。解析器应该已经检测到错误。 yacc 有内置的东西吗?

yacc 只知道词法分析器可以识别的标记。由于它们 相同,词法分析器只能通过使用 states.

来改进这种情况

也就是说,您可以告诉 lex 记住它看到了一个 BEGIN 并自己计算标记,return 一个不同类型的 IDENT(并进行检查那里)。

但是yacc更适合这种事情,所以原问题的答案是"no",没有更好的解决办法