Yacc规定了模棱两可的语法

时间:2012-08-13 15:56:06

标签: bison yacc

我正在尝试编写一个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是代币)

这是怎么做到的?

1 个答案:

答案 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 ;