質問

拡張されたバックスナウルス(EBNF)コンテキストフリーグラマルを使用して、順序付けられていない一連の値を定義したいと思います。EBNF内の順序付けられていない値のリストを定義するのは簡単です。

value = 'A' | 'B' | 'C';
list = value, {',', value};
.

しかし、疑わしいセットのために行うことができます。

下記の

有効な値の値の一例です。

A, B, C, D
A, B, D, C
A, D, C, B
...
D, C, B, A
.

無効なリストは次のとおりです。

A, A, C, D
B, C, C, B
A, A, A, A
...
.

または任意の長さのリスト。

A, A, B, C, D, A
A, B, C, D, A, B, C, D
...
.

役に立ちましたか?

解決

は、ebnf内の順序付けされていないセットを定義しますが、考えられるすべての列挙を一覧表示するだけです。それは約2つの要素より大きいセットには実用的ではありません。

標準 - EBNFがある範囲で。標準化された表記法 - 他の方法で説明できないシーケンスを説明するために英語(または快適に感じる他の言語)を使用することができます。たとえば、EBNF用のEBNFには、この製造が含まれています。

syntactic exception
= ? a syntactic-factor that could be replaced 
    by a syntactic-factor containing no
    meta-identifiers
  ? ;
.

同様に、あなたは次のようなものを書くことができます:

value = 'A' | 'B' | 'C';
list = value, {',', value};
set = ? a "list" where all "value"s are unique ? ;
.

またはおそらく

set = ? a "list" with exactly three values
        where all "value"s are unique
      ? ;
.

パーサージェネレータを構築するためのあまり使い切らないが、あなたと同じ言語を理解している人間の読者には役立つかもしれません。

Real Parser Generatorsの場合、共通の戦略は、繰り返し要素を含めることができるリストを許可し、次に意味解析中に無効なリストを拒否します。 (または以前でさえも難しい分析ではありません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top