2011-02-10 8 views

答えて

5

...そうです。 「BNF/EBNFは」長いおおよそ次のような形式で文法規則を書くことを意味しています他の愚かなのlangaugeの違いと同じように

nonterminal = right_hand_side end_rule_marker 

(「{」Cで、パスカルは、FI対ENDIFで始まる)あなたは非常に得ることができますend_rule_markerの構文と、あなたがright_hand_sideのために言うことを許可されている構文を選択することによって、見た目は異なるが同じ意味を持つ。

通常、引用符やその他の非終端記号名にはリテラルトークンを使用できますが、EBNFではさまざまな "選択"演算子が通常使用されます。または/または代替の場合は「*」、「繰り返す」の場合は「+」、「...」または?オプションなどのために。

言語構文を設計する人は構文を使用しているため、いくつかの記述を書き留めるたびに独自の言語構文を作成するようです。 (言語標準のさまざまな構文形式をチェックする;それらのどれも同じではない)。はい、私たちはすべて、このようなものを書くための標準的な方法があれば、より良くなるでしょう。しかし、私たちはCやC++やC#(マイクロソフトでさえ独自の標準に従うことさえできません)ではそうしません。なぜBNFは違うのですか?

パーサージェネレーターを作成する人は、通常、独自の構文を解析するためにパーサージェネレーターごとに独自の構文を定義することができます。私はウィキペディアで「WSN」バージョンを正確に行ったことは一度も見たことがなく、私は実際にこれが実現するかどうかは疑問です。

大変ですか?うーん、ダメ。本当に重要なのは、表記法の背後にあるパーサジェネレータの力です。パーサジェネレータの力(よく、弱さ)に合わせて、ほとんどの文法を曲げる必要があります。例えば、LLスタイルのジェネレータの場合、文法ルールは再帰を残すことはできません(WSNは私の読書に従います)。パーサジェネレータを構築している人は、非パーサの問題(「ツリーノードを構築する方法」など)を表現するのが便利で、パースされていない問題のために余分な表記法も追加したいと考えています。

実際にパーサジェネレータ構文を駆動するのは、任意の言語を処理するパーサジェネレータの弱点、パーサジェネレータにとって価値のある特別なもの、それを実装する人の気分です。

関連する問題