Parsing Lex/Yacc:两个终端符号的相同正则表达式
我正在研究一个解析器,我需要能够使用相同的正则表达式拥有两个不同的符号 但是,我的解析器无法工作,因为两个正则表达式是相同的,lexer将始终匹配第一个,并且可能返回错误的符号并导致解析失败 我不能将两个符号合并为一个符号,而依赖于语义分析,因为我的语法会变得模棱两可,因为我有如下规则: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,这
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来显示真正的解析器冲突。我不是说你应该合并非终端。