从C语言初始化列表的语法中解决歧义

时间:2016-04-13 21:31:51

标签: bison context-free-grammar shift-reduce-conflict ambiguous-grammar

我似乎无法解决以下规则中包含的歧义:

InitializerList_a→,[Initializer] [InitializerList_a]

它导致我的解析器中的转换/减少冲突(我正在使用Bison)。以下是关闭:

InitializerList_a → ε

Initializer → [Constant]

Initializer → {[InitializerList][Initializer_a]

Initializer_a → }

Initializer_a → ,}

InitializerList → [Initializer][InitializerList_a]

任何帮助将不胜感激。如果需要,我可以发布野牛输出文件。

这是以更易读的方式编写的相同语法:

L → IT

T → ,IT | ε

I → [Constant] | {LA

A → } | ,}

where [Constant] is a terminal

1 个答案:

答案 0 :(得分:0)

这应该涵盖它。像语法一样的YACC更喜欢在语法中通过尾递归来进行头递归。

%start I
%token CONSTANT
%%
I: CONSTANT | '{' L '}' ;
L: J | J ',' ;
J: I | J ',' I ;