2011-06-23 12 views
2

文脈のない言語、つまりContext Free Artを解析しようとしています。私は、YACCのようなJS LALR(1)パーサジェネレータJSCCを使って、Javascriptでそのパーサを作成しました。1つのLALR(1)解析に関する助けが必要

次のCFA(Context Free Art)コードの例を見てください。このコードは有効なCFAです。

上記のAおよびsに注目してください。 sCIRCLEをスケールするコマンドですが、Aはこのルールの名前に過ぎません。言語の文法では、sをトークンSCALEに、AをトークンSTRINGの下に指定しています(文字列に一致する正規表現があり、すべてのトークンの一番下にあります)。

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

startshape s 
rule s { CIRCLE { s 1} } 

これはあまりにも完全に有効なコードですが、私のパーサマーク以来sruleSCALEとしてトークンの後にエラーが出て、それがSTRINGを期待していたことを言って。

私の質問は、これを説明するパーサーの生産ルールを書き直す方法があれば、今ですか?関連プロダクションルールは次のとおりです。 - 私は考えることができる

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

一つの簡単な解決策は、SCALEに置き換えSTRINGで上記のルールのコピーを作成しているが、これはちょうどこのような定着を必要とする多くの同様のルールの一つです。さらに、STRINGにマッチすることができる他の多くの端末があります。だからそれはあまりにも多くのルールを意味する!

+0

上記のアドオンのみ。 YACC(またはBison)は型トークンをサポートしています。したがって、もし 'STRING'を型トークンとして宣言すれば' s'は 'SCALE'と' STRING'の両方になり、この問題を解決します。これがJSCCでできるかどうかはわかりません。 – AppleGrew

答えて

0

はい!最後に、私の問題に対する解決策が私を襲ってきました。これは私が私の問題テキストに言及したものと比較し、かなりエレガントなソリューションです

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

user_string: 
    STRING | SCALE ; 

- :私がやらなければならないことは、私に上記の生産を修正しています。誰かより良い解決策があればコメントしてください。

関連する問題