规则具有相同的字符串标记两次

时间:2015-07-21 08:07:37

标签: yacc

使用yacc,我想解析像

这样的文本
begin foo ... end foo

字符串foo在编译时是未知的,可能会有所不同 这些字符串在同一输入中。

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

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

这感觉不对。解析器应该已经检测到错误。是否内置了yacc?

1 个答案:

答案 0 :(得分:2)

yacc只知道词法分析器可以识别的标记。由于这些相同,因此词法分析者只能通过使用状态来改善这种情况。

也就是说,你可以告诉lex记住它看到了BEGIN并计算了令牌本身,并返回了不同类型的IDENT(并在那里进行检查)。

然而,yacc更适合这类事情,所以原来问题的答案是“不”,没有更好的解决方案。