Lex / Yacc:两个终端符号

时间:2016-04-07 14:03:03

标签: parsing pattern-matching yacc lex

我正在研究解析器,我需要能够使用相同的正则表达式创建两个不同的符号。

但是,我的解析器无法工作,因为两个正则表达式是相同的,词法分析器将始终匹配第一个和错误的符号可能会被返回并导致解析失败。

我无法将两个符号合并为一个符号并依赖于语义分析,因为我的语法会变得模糊,因为我有以下规则:

a : c a
  | c

b : d b
  | d

用a和b表示具有相同正则表达式的符号。 如果我将它们合并为单个符号,让我们说e,这可能会产生如下规则:

e -> c e -> c d e -> ...

包含c符号的规则和带有d符号的规则必须保持分开。

这就是为什么我更喜欢保持ab不同,并试图找到一种方法来匹配相同的正则表达式。

  • 是否有任何解决方案可以防止lex特别停止规则,以便它可以匹配最终的其他regex并让语法决定应该使用哪一个?

  • 也许我的做法是错的,那我该如何重新思考我的语法呢?

1 个答案:

答案 0 :(得分:1)

如果不存在冲突,则无需使用两个符号。解析器将正确解释令牌。

如果您对不同的上下文需要不同的语义值,则可以使用具有相同右侧的两个不同单元规则将语义操作移动到解析器。例如:

scanner.l

{sym}     { yylval.str = strdup(yytext); return SYM; }

parser.y

sym1      SYM { $$ = semval1($1); free($1); }
sym2      SYM { $$ = semval2($1); free($1); }
相关问题