0

CoffeeScriptのようにインデントなしで区切り記号をほとんど使用せずに、 Jisonを使用して言語を定義しようとしています。これは私が達成したいことのようなものです:

# Definition
object1, object2
    property1 = value1,
    property2 = value2

# Definition
object3 property = value

# Statement
object1 + object2 + object3

これは、いくつかのプロパティを持つ 3 つのオブジェクトを定義し、それらを追加します。最初の定義は名前のリストを使用して 2 つのオブジェクトを指定し、2 番目の定義は空白が重要でないことを示していることに注意してください。

名前のリストとプロパティのリストの間に開始記号と終了記号がないにもかかわらず、文法があいまいではないように感じます。文法では、すべての名前リストの後にプロパティ リストが続くことを指定しています。次のようなプロダクションを含む、定義を指定するだけの文法を書くと、これはすべてうまくいくようです。

definition
    : name_list property_list
    ;

name_list
    : name
    | name_list ',' name
    ;

property_list
    : property
    | property_list ',' property
    ;

property
    : name '=' name
    ;

ここで、文法の式部分の規則を、私が知る限りごく普通の方法で追加します。

expr
    : expr '+' expr
    | expr '/' expr
    | name
    ;

Jison は、いくつかの番号付けされた状態のさまざまな先読みトークンの束に対して「複数のアクションが可能」であると不満を漏らしています。リダクション オプションは通常、次のようになります。

- reduce by rule: name_list -> name
- reduce by rule: expr -> name

文法は明確だと思いますが、どうすればこれをジソンに納得させることができますか? 1 つではなく 2 つのトークンを先読みする必要があるようですが、それは盲目的な推測であり、Jison のドキュメントでは、(まだ?) LL( k ) 文法をサポートしていないと述べています。

4

1 に答える 1

1

expr文法全体を示しているわけではありませんが、問題は、単純な名前である と、名前リストに単一の名前を持つ宣言の先頭を区別できないことです。入力を考慮する

A B = C

A B C = D

最初のケースは、A1 つのプロパティを持つ の単一の定義であり、2 番目のケースは、式のA後に の定義が続くものですB

問題は、パーサーがAの先読みを見て調べた後にこれらのケースのどちらかを決定する必要があることですBが、それはできません。さらに先読みが必要です ( の後にあるものを確認するためB) 。

言語を変更するか、(効果的に) 追加の先読みを取得することで、これを回避するためにできることがいくつかあります。

  1. 言語の変更。名前が 1 つだけのステートメントでは意味がない場合があります。statementしたがって、単純な名前を許可しない別のルールを持つように言語を変更できます。

    statement: expr '+' expr | expr '/' expr ;
    expr: statement | name ;
    

    aには演算子が含まれている必要があるため、追加の先読みを必要とせずに astatementと aを区別できるようになりました。declarationstatement

  2. ツールを変更します。bison の%glr-parserオプションや、非 LALR(1) 文法を処理できるbtyaccのようなツールを使用できます。ただし、Jison が何をサポートしているのかはまったくわかりません。

  3. レクサーで余分な先読みをシミュレートします。レクサーに余分な先読みをさせることができます。一致するレクサー パターン(つまり、名前の後に = 記号が続く) があり、.の代わりに特別なトークン[a-zA-Z]+[ \t\n]*=を返すようにすることができます。次に、ルールは次のようになります。propnamenameproperty

    property: propname name ;
    
于 2013-02-26T20:01:34.620 に答える