我正在尝试编写一个yacc语法来识别以下模式:
AAAA -> Multiple As
BBBB -> Multiple Bs
AAAABB -> 2 As followed by (AABB)
AAABBBBB -> (AAABBB) followed by 2Bs
一般来说,我想将相等的连续As和B组合在一起,优先于As或Bs的运行。直截了当的语法显示了一堆冲突。
我需要一种方法来优先考虑这种生产。
T -> | AB | ATB
在
U -> | AU
(其中T和U是yacc产品,A和B是代币)
这是怎么做到的?
答案 0 :(得分:2)
一般来说,yacc无法处理含糊不清的语法。如果你给它一个含糊不清的语法(或任何非LALR(1)语法),它将解析该语法语言的一个子集,这可能是你想要的也可能不是。
使用bison,您可以使用%glr-parser
创建一个可以解析模糊语法的glr解析器。但是,您需要将%dprec
和%merge
指令添加到语法中的适当位置以解决歧义,否则最终会出现运行时错误。
但是,您所描述的语言并不是特别模糊。事实上,它相当简单的LALR(1),因此可以通过yacc轻松处理:
%token A B
%%
input: multiA | multiB | twoA | twoB ;
multiA: A | A A | A A A | A A A moreAs ;
moreAs: A | moreAs A ;
multiB: B | multiB B ;
twoA: A A A A B B ;
twoB: A A A B B B B B ;