2011-07-17 12 views
4

parsing expression grammar(PEG)内に「順序付けられていないシーケンス」を表現する方法はありますか?式文法を解析して順序付けられていないシーケンスを解析する

Rule <- A B C 

のようなルールでは、A、B、Cが順番に一致する必要があります。このよう

Rule <- (A B C)/(B C A)/(C A B)/(A C B)/(C B A)/(B A C) 

などのルールは、彼らが(私たちが望むものである)任意の順序で一致させることができますが、それは順序でより多くの観点で実際に面倒で適用できません。

は、このような

Rule <- (A/B/C){3} 

として文法的に緩いルールを使用し、意味的に各ルールは一度だけ一致していることを確認するための唯一のソリューションですか?

XMLを解析するためにRelax NG Compact Syntaxに"unordered list" operatorがあるという事実は、明らかな解決策がないことを私に示唆しています。

最後の質問:このような演算子を追加するとPEGにあいまいさが生じると思いますか?

答えて

1

文法規則は、選択したエンジンの解析(例:PEG、LALR、LL(k)、...)に関係なく、必要なフォームの順序を正確に表します。

あなたがBNFルールを使用しているもののすべての可能なシーケンスを望むという唯一の表現は、あなたが提案した大きな醜いルールです。

標準溶液は、単純に定義することです:

rule <- (A | B | C)* 

(またはあなたのパーサジェネレータは、リストの受け入れどんな構文)と意味的にのみ3フォームが用意され、それらが一意であることを数えます。

多くの場合、パーサージェネレータを構築する人は、特殊な状況を記述できるように特別な「拡張BNF」表記を追加します。特殊構文として{3}を使用して、パーサジェネレータがこの表記法を受け入れて適切な執行を行うという仮定の下で "3 of"だけを必要としたことを意味しています。自分の状況を説明できるように、拡張記法{ユニーク}を想像することができます。私はそのアイデアを実装したパーサージェネレータを見たことがありません。

関連する問題