7

私は、後のプロジェクトで使用する予定のプリプロセッサ言語用のトークナイザーと式評価器を作成しました。言語を 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 で書くことにした場合、演算子の優先順位を考慮して書くか、それとも別のセクションで文書化する必要がありますか?

4

1 に答える 1

6

私の同僚の学位のために同様のことをしました。

「シンタクト シュガー」のように簡単に見えても、演算子の優先順位機能を使用しないことをお勧めします。

なんで ?ほとんどの言語は EBNF によって記述されるため、演算子の優先順位ではなく、EBNF 式を使用して記述および更新する方が適切な、さまざまな機能を備えた多くの演算子を使用します。

一部の演算子は単項接頭辞、単項接尾辞、バイナリ (別名「インフィックス」)、一部のバイナリは左から右に評価され、一部は右から左に評価されます。一部の記号は、あるコンテキストでは演算子であり、別のコンテキストでは他のトークンとして使用されます。たとえば、"+"、"-"、二項演算子 ("x - y")、単項前置演算子 ("x - -y") にすることができます。 )、またはリテラルの一部 ("x + -5")。

私の経験では、それらを EBNF 式で記述する方が「安全」です。あなたが説明するプログラミング言語が非常に小さく、類似した構文演算子がほとんどない場合を除きます(例:すべてバイナリ、またはすべて接頭辞単項)。

ちょうど私の2セント。

于 2014-08-13T18:24:29.923 に答える