Parsing Lex/Yacc:两个终端符号的相同正则表达式

Parsing Lex/Yacc:两个终端符号的相同正则表达式,parsing,pattern-matching,yacc,lex,Parsing,Pattern Matching,Yacc,Lex,我正在研究一个解析器,我需要能够使用相同的正则表达式拥有两个不同的符号 但是,我的解析器无法工作,因为两个正则表达式是相同的,lexer将始终匹配第一个,并且可能返回错误的符号并导致解析失败 我不能将两个符号合并为一个符号,而依赖于语义分析,因为我的语法会变得模棱两可,因为我有如下规则: a : c a | c b : d b | d e -> c e -> c d e -> ... 用a和b表示具有相同正则表达式的符号。 如果我将它们合并成一个符号,比如说e,这

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

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

我不能将两个符号合并为一个符号,而依赖于语义分析,因为我的语法会变得模棱两可,因为我有如下规则:

a : c a
  | c

b : d b
  | d
e -> c e -> c d e -> ...
用a和b表示具有相同正则表达式的符号。 如果我将它们合并成一个符号,比如说
e
,这可能会产生如下规则:

a : c a
  | c

b : d b
  | d
e -> c e -> c d e -> ...
包含
c
符号的规则和包含
d
符号的规则必须分开

这就是为什么我更喜欢保持
a
b
的不同,并试图找到一种方法,使符号与相同的正则表达式匹配

  • 是否有任何解决方案可以防止lex在特定的规则上停止,以便它能够匹配其他最终的正则表达式,并让语法决定应该使用哪一个

  • 也许我的方法是错误的,那么我应该如何重新思考我的语法呢


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

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

扫描器 语法分析器
实际上,如果我使用一个符号,就会有冲突,这就是为什么我愿意使用两个不同的符号。使用两个不同的符号也大大简化了解析器,因为不需要进一步的语义检查。@ibi0tux:在你的问题中,你说“这些符号用于完全不同的语法部分,不可能有冲突。”现在你似乎自相矛盾。我想我的问题不是很清楚。我正在编辑它。@ibi0tux:在您的编辑中,
a
b
似乎既是终端又是非终端。也许最好使用一个真正的MCVE来显示真正的解析器冲突。我不是说你应该合并非终端。