0
 %token ENTIER REEL VECTOR INTEGER FLOAT CONST READ DISPLAY IF ELSE FOR END AND OR NOT G L GE LE EQ DI ACOUV AT
 %token ACFER AFFEC PLUS MOIN MUL DIV CROOUV CROFER PAROUV PARFER SEP VERG PVERG DEUXPT ESPACE ID CAR CHCAR STRING

 %start S 
 %%
S: ID ACOUV DEC CODE ACFER;    

J'ai ce message qui apparait lorse que je fait bison -d prog.y :

致命的なエラー: 開始記号 S は文を導出しません

4

2 に答える 2

1

bison -dあなたの入力で私に与えます:

test.y:6.17-20: symbol CODE is used, but is not defined as a token and has no rules
test.y:6.13-15: symbol DEC is used, but is not defined as a token and has no rules

これは、問題が何であるかを正確に示しています-それらを使用CODEDECていて、定義していません。それらをいずれかの行に追加すると、%token正常に動作します...

編集

「開始記号 S は文を導出しません」というエラーは、文法に無制限の再帰があるため、(有限の) 入力が開始記号と一致しないことを示しています。あなたの場合、SaCODEを含める必要があります。これには a を含める必要があります(command直接または a を介してlistcommand) 。したがって、-> -> ->の無限展開チェーンになります。bouclelistcommandlistcommandscommandbouclelistcommands

問題はおそらくあなたのルールです

listcommands: command | listcommands ;

これは正確に 1 つのコマンドと、そのコマンドの役に立たない (そしてあいまいな) 無制限の noop 展開に一致します。あなたはおそらくしたいです

listcommands: /*epsilon*/ | listcommands command ;

これは、0 個以上commandの s に連続して一致します。この変更を行うと、致命的なエラーは修正されますが、役に立たないルールとともに、多数の shift-reduce 競合が残りますdectype: dectype

shift/reduce 競合を追跡して修正するには、 を使用bison -vして.output、文法、状態、および競合を詳細にリストしたファイルを作成します。あなたのもののほとんどは の優先順位がないことに由来NOTし、他の 2 つはあいまいなdectypeandCODE規則に由来します。

于 2014-11-29T00:49:11.147 に答える