Bison 模糊语法的Yacc规则

Bison 模糊语法的Yacc规则,bison,yacc,Bison,Yacc,我试图编写一个yacc语法来识别以下模式: AAAA -> Multiple As BBBB -> Multiple Bs AAAABB -> 2 As followed by (AABB) AAABBBBB -> (AAABBB) followed by 2Bs 通常,我希望将相邻As和Bs的相等块分组在一起,优先于As或Bs的运行。直截了当的语法说明了一系列冲突 我需要一种方法来优先考虑这部作品 T -> | AB | ATB 结束 (其中T和U为ya

我试图编写一个yacc语法来识别以下模式:

AAAA  -> Multiple As
BBBB  -> Multiple Bs
AAAABB -> 2 As followed by (AABB)
AAABBBBB  -> (AAABBB) followed by 2Bs
通常,我希望将相邻As和Bs的相等块分组在一起,优先于As或Bs的运行。直截了当的语法说明了一系列冲突

我需要一种方法来优先考虑这部作品

T -> | AB | ATB
结束

(其中T和U为yacc产品,A和B为代币)


这是如何做到的?

一般来说,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 ;

这不会接受表单(A^n B^n)的所有字符串。如果我一开始不清楚,很抱歉。@Kumar:这样的字符串不是您描述的模式。也许如果你给出你试图使用的语法,我们可以就如何处理歧义给出一些建议。这就是我想做的。在一个长的As和Bs流中,我想将a^NB^n优先分组,而不是将连续的As或Bs分组:上面T和U的两个结果表明了这一点。因此,如果我有流aaaabbaabbbabbab,我想将其解析为AA(AABB)A(aaabb)abb(AB),而不是as和Bs的块。希望我现在明白了。
%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 ;