右辺が空のルールで (「理論的な」) 文法を書く場合、常に ε (または 1) などの記号を使用して、この空を明示します。
A → ε | a A
Yacc などの文法は次のようになります。
a: | 'a' a
または「悪い」
a: { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
「現実世界の文法」 (Yacc、Bison など) では、ルールのこの空の右側部分が明示的に空としてマークされていないという事実は、私を悩ませます: rhs が空であるという事実を見逃すのは簡単です。さらに悪いこと|
に、規則の途中のアクションを挿入して実際に使用するのを忘れる:
a: { $$ = new_list(); }
a 'a' { $$ = $1; $$->append($1); }
;
1) 空の rhs を明示的にする手段を提供するツールを知りません。いずれかがあります?
Bison の将来のバージョンでは専用のシンボルがサポートされる可能性があります。空でない rhs で使用するとエラーが発生し、暗黙的に空の rhs が残っていると警告が表示されます。
2) 人々はこれを有用だと考えていますか?
3) あなたが提案する記法は何ですか?
現在、候補者は次の$empty
とおりです。
a: $empty { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
編集
選択した構文は%empty
次のとおりです。
a: %empty { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
確かに、Bison が最初のルールに対して生成する疑似シンボル、またはルールの途中のアクション、またはファイルの終わりに対して$empty
疑似シンボルのように見えます。しかし、それは間違いなく記号ではなく、まさに記号の不在です。$accept
$@n
$eof
一方、 の%
ようなディレクティブ (ある種の属性/メタデータ) を明確に示します%pred
。
したがって、構文の小さな違いですが、全体的な構文との一貫性が向上しています。クレジットは Joel E. Denny にあります。