0

flex と bison を使用して、特定の言語のミニ コンパイラを作成しようとしています。再帰を含むルールを忘れていたことに気付くまで、それは正常に機能していました。ルールは次のとおりです。

 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 ';'
;

基本的に、DATAブロックで定数とともに文字を定義できると言っています

これが私の.outputです

É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
4

1 に答える 1

1

Aは、間に句読点がないliste_const単なるリストです。constante

constante constante constante constante

そして、adeclarかもしれませんliste_const

を持っている場合はどうなりますかliste_data(これは本当に aliste_declarですか?)。それは のリストのリストかもしれませんが、 の最初のリストがどこで終わり、次のconstanteリストがどこで始まるかを知る方法はありません。constanteしたがって、上記は次のように解析できます

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

また

<list_const <constante constante constante constante>>

または多数の他の可能性。

の状況liste_typeは類似しています。

言い換えれば、 aliste_dataを定数と型のリストのリストにしたくないということです。(定数または型)のリストにしたい。

個人的には、次のように変更します。

declar: def_type | constante;

liste_typeとを取り除きlist_constます。

于 2014-04-17T16:35:53.607 に答える