2

Context Free Artと呼ばれる文脈自由言語を解析しようとしています。YACC のような JS LALR(1) パーサー ジェネレーターJSCCを使用して、Javascript でパーサーを作成しました。

次の CFA (Context Free Art) コードの例を見てみましょう。このコードは有効な CFA です。

startshape A
rule A { CIRCLE { s 1} }

A上記のとに注意してくださいssをスケーリングするコマンドですがCIRCLEAこのルールの名前にすぎません。言語の文法では、トークンとして設定sし、トークンの下にSCALEあります(文字列に一致する正規表現があり、すべてのトークンの一番下にあります)。ASTRING

これは問題なく動作しますが、以下の場合は壊れます。

startshape s
rule s { CIRCLE { s 1} }

これも完全に有効なコードですが、私のパーサーはs後にruleas SCALEtoken をマークするため、期待していたと言ってエラーになりますSTRING

私の質問は、これを説明するためにパーサーのプロダクション ルールを書き直す方法があるかどうかです。関連する生産規則は次のとおりです。

rule:
    RULE STRING '{' buncha_replacements '}'    [* rule(%2, 1) *]
    |
    RULE STRING RATIONAL '{' buncha_replacements '}'  [* rule(%2, 1*%3) *]
    ;

私が考えることができる簡単な解決策の 1 つは、上記のルールのコピーを でSTRING置き換えて作成することSCALEですが、これは、そのような修正が必要な多くの同様のルールの 1 つにすぎません。さらに他にもマッチング可能な端末はたくさんありますSTRING。つまり、ルールが多すぎるということです。

4

1 に答える 1

0

はい!最後に、私の問題の解決策が私を襲った。私がする必要があるのは、上記のプロダクションを次のように変更することだけです。

rule:
    RULE user_string '{' buncha_replacements '}'    [* rule(%2, 1) *]
    |
    RULE user_string RATIONAL '{' buncha_replacements '}'  [* rule(%2, 1*%3) *]
    ;

user_string:
    STRING | SCALE ;

これは、問題のテキストで述べたものと比較して、かなり洗練されたソリューションです。誰かがより良い解決策を持っているなら、コメントしてください。

于 2011-06-23T13:44:30.453 に答える