質問
私は私の質問にまったく答えを得なかったので 選択の設定構文や非常に類似したものをサポートするMKS YACCに代わるものはありますか?, 、より基本的な質問をします:
- MKS YACCが提供する「選択選好」を使用した人はいますか?
あなたが持っているなら、あなたはそれを何のために使用しましたか?また、ルールの最後の位置以外のものでそれを使用することは理にかなっていますか?
次のようなルールを把握する文法の世話をする必要があります。
TOKEN1 LPAREN non_terminal1 [^EQUAL] TOKEN2 non_terminal2 RPAREN
私が何かを誤解していない限り、組み込みの選択選好は、この文脈で何の価値も提供しません。
バックグラウンド
MKS YACCは、彼らのWebサイトが呼ぶ表記をサポートしています」選択設定構文「。説明されていませんが、正方形の括弧内のトークンのトークンのリストで構成されています(オプションかもしれません)。このルールの一部として:
non_terminal1: TOKEN1 non_terminal2 TOKEN2 [^TOKEN3]
したがって、この規則には、 TOKEN1
続いてa non_terminal2
そしてa TOKEN2
aです non_terminal1
, 、次のトークンがa TOKEN3
その場合、他のいくつかのルールが適用されます。
(ブラケットのアイテムが非ターミナルであるかどうかは明らかではありません。表記を使用して見たコードは、常にトークンまたはいくつかのスペース分離トークンを使用し、決してターミナルではありません。私もそうではありません。カレットが必要かどうかを明確にします。繰り返しますが、私が見たすべての例は、カレットを使用しています。)
解決
ジョナサン。午前1時30分に、私はこれを自分でやろうとはしていませんが、それらのルールが何をするにしても、通常のBNFのようなもので書くことができるルールの略記のみができます。これを見ると、「選択選好」がしていることは、1つの文法ルールでいくつかのプロダクションとなるものを表現できるようになっているようです。
少し掘り下げて見つけました これ, 、私の仮定を確認します:選択の選好が行うことにより、Lookaheadを明示的に挿入することができます。
私が提案するのは、YACCまたはストレートBNFに書き直された場合、これらのルールの1つがどのように見えるかについて考えることです。私はそれが次のようになると思う
TOKEN1 LPAREN non_terminal1 MULT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 DIVIDE TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 ADD TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 SUBTRACT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 EXP TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 MOD TOKEN2 non_terminal2 RPAREN
...
全体的な効果は、すべてのオペレーターに対して1つのルールを取ることであるためです を除外する 等しい、 [^
セットの補完のようなものについて、さまざまなベルラボ言語で一般的な表記法。