私は、後のプロジェクトで使用する予定のプリプロセッサ言語用のトークナイザーと式評価器を作成しました。言語を EBNF (Extended Backus-Naur Form) で記述して、構文をより保守しやすくしたり、それを使用して新しいバージョンのパーサーを生成したりする必要があるのではないかと考え始めました。
私の第一印象は、トークン化プロセスと構文検証に EBNF が使用されているということでした。後で、この投稿やウィキペディアの記事のように、演算子の優先順位を記述するためにも使用できることを発見しました。
expression ::= equality-expression
equality-expression ::= additive-expression ( ( '==' | '!=' ) additive-expression ) *
additive-expression ::= multiplicative-expression ( ( '+' | '-' ) multiplicative-expression ) *
multiplicative-expression ::= primary ( ( '*' | '/' ) primary ) *
primary ::= '(' expression ')' | NUMBER | VARIABLE | '-' primary
ジェネレーターが組み込みの演算子の優先順位を使用してコードを生成できるようにする方法はわかりますが、これは実際にどのように優先順位を表現する必要がありますか? 演算子の優先順位はセマンティクスに関するものであり、EBNF は構文に関するものではありませんか? 自分の言語の説明を EBNF で書くことにした場合、演算子の優先順位を考慮して書くか、それとも別のセクションで文書化する必要がありますか?