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