文脈のない言語、つまりContext Free Artを解析しようとしています。私は、YACCのようなJS LALR(1)パーサジェネレータJSCCを使って、Javascriptでそのパーサを作成しました。1つのLALR(1)解析に関する助けが必要
次のCFA(Context Free Art)コードの例を見てください。このコードは有効なCFAです。
上記のA
およびs
に注目してください。 s
はCIRCLE
をスケールするコマンドですが、A
はこのルールの名前に過ぎません。言語の文法では、s
をトークンSCALE
に、A
をトークンSTRING
の下に指定しています(文字列に一致する正規表現があり、すべてのトークンの一番下にあります)。
これは問題なく動作しますが、以下の場合は壊れます。
startshape s
rule s { CIRCLE { s 1} }
これはあまりにも完全に有効なコードですが、私のパーサマーク以来s
rule
SCALE
としてトークンの後にエラーが出て、それがSTRING
を期待していたことを言って。
私の質問は、これを説明するパーサーの生産ルールを書き直す方法があれば、今ですか?関連プロダクションルールは次のとおりです。 - 私は考えることができる
rule:
RULE STRING '{' buncha_replacements '}' [* rule(%2, 1) *]
|
RULE STRING RATIONAL '{' buncha_replacements '}' [* rule(%2, 1*%3) *]
;
一つの簡単な解決策は、SCALE
に置き換えSTRING
で上記のルールのコピーを作成しているが、これはちょうどこのような定着を必要とする多くの同様のルールの一つです。さらに、STRING
にマッチすることができる他の多くの端末があります。だからそれはあまりにも多くのルールを意味する!
上記のアドオンのみ。 YACC(またはBison)は型トークンをサポートしています。したがって、もし 'STRING'を型トークンとして宣言すれば' s'は 'SCALE'と' STRING'の両方になり、この問題を解決します。これがJSCCでできるかどうかはわかりません。 – AppleGrew