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
これは、問題が何であるかを正確に示しています-それらを使用CODE
しDEC
ていて、定義していません。それらをいずれかの行に追加すると、%token
正常に動作します...
編集
「開始記号 S は文を導出しません」というエラーは、文法に無制限の再帰があるため、(有限の) 入力が開始記号と一致しないことを示しています。あなたの場合、S
aCODE
を含める必要があります。これには a を含める必要があります(command
直接または a を介してlistcommand
) 。したがって、-> -> ->の無限展開チェーンになります。boucle
listcommand
listcommands
command
boucle
listcommands
問題はおそらくあなたのルールです
listcommands: command | listcommands ;
これは正確に 1 つのコマンドと、そのコマンドの役に立たない (そしてあいまいな) 無制限の noop 展開に一致します。あなたはおそらくしたいです
listcommands: /*epsilon*/ | listcommands command ;
これは、0 個以上command
の s に連続して一致します。この変更を行うと、致命的なエラーは修正されますが、役に立たないルールとともに、多数の shift-reduce 競合が残りますdectype: dectype
。
shift/reduce 競合を追跡して修正するには、 を使用bison -v
して.output
、文法、状態、および競合を詳細にリストしたファイルを作成します。あなたのもののほとんどは の優先順位がないことに由来NOT
し、他の 2 つはあいまいなdectype
andCODE
規則に由来します。