由于递归规则而导致的移位/减少



我正在尝试使用flex&野牛它一直运行良好,直到我发现我忘记了一条规则其中包含递归,规则为:

 liste_data : liste_data declar | declar;

正如我补充的那样,我有一些我不理解的冲突。我的语法不含糊

这是我语法的简化版本:

s:idf bloc_data mc_end   { printf ("programme juste (lexique+syntaxe)n"); YYACCEPT;}
;
bloc_data:mc_data liste_data mc_end
|mc_data mc_end
;
liste_data : declar
|liste_data declar
;
declar: liste_const
|liste_type
;
liste_type:liste_type def_type
|def_type
;
def_type:mc_char ':' liste_var ';'
;
liste_var:idf
|liste_var '|' idf
;
liste_const:liste_const constante
|constante
;
constante:mc_const ':' idf affect entier ';'
;

它基本上说我可以在数据块中定义字符和常量

这是我的输出

État 11 conflits: 1 décalage/réduction
État 13 conflits: 1 décalage/réduction

Grammaire
0 $accept: s $end
1 s: idf bloc_data mc_end
2 bloc_data: mc_data liste_data mc_end
3          | mc_data mc_end
4 liste_data: declar
5           | liste_data declar
6 declar: liste_const
7       | liste_type
8 liste_type: liste_type def_type
9           | def_type
10 def_type: mc_char ':' liste_var ';'
11 liste_var: idf
12          | liste_var '|' idf
13 liste_const: liste_const constante
14            | constante
15 constante: mc_const ':' idf affect entier ';'
.
.
.
état 11
7 declar: liste_type .
8 liste_type: liste_type . def_type
mc_char  décalage et aller à l'état 7
mc_char   [réduction par utilisation de la règle 7 (declar)]
$défaut  réduction par utilisation de la règle 7 (declar)
def_type  aller à l'état 20

état 13
6 declar: liste_const .
13 liste_const: liste_const . constante
mc_const  décalage et aller à l'état 8
mc_const  [réduction par utilisation de la règle 6 (declar)]
$défaut  réduction par utilisation de la règle 6 (declar)
constante  aller à l'état 21

它说我的转变/减少冲突是在州11&13,但我不知道为什么。它应该识别这样的东西:

DATA
CONST: Er=5;
CONST: H=56;
CHAR: Hg|rt;
END

liste_const只是constante的列表,没有插入标点符号:

constante constante constante constante

declar可能是liste_const

如果你有一个liste_data(实际上是liste_declar,不是吗?)。这可能是constante的列表,但无法知道constante的第一个列表在哪里结束,下一个列表从哪里开始。因此,以上内容可以解析为

<list_const <constante constante>> <list_const <constante>> <list_const <constante>>

<list_const <constante constante constante constante>>

或大量其他可能性。

liste_type的情况类似。

换句话说,您不希望liste_data是常量和类型列表;您希望它是(常量或类型)的列表。

就我个人而言,我只想改变一下:

declar: def_type | constante;

去除CCD_ 11和CCD_。

相关内容

  • 没有找到相关文章

最新更新