使用相同的字符串标记规则两次
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",没有更好的解决办法
使用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",没有更好的解决办法