EBNF形式のスカラからANTLRへの接尾辞、接尾辞および接頭辞の規則を変換しようとしていますが、infixExpression規則の左回帰に関するエラーが表示されています。Antlr left recursive
問題のルールは以下のとおりです。
public symbolOrID
: ID
| Symbol
;
public postfixExpression
: infixExpression symbolOrID? -> ^(R__PostfixExpression infixExpression symbolOrID?)
;
public infixExpression
: prefixExpression
| infixExpression (symbolOrID infixExpression)? -> ^(R__InfixExpression infixExpression symbolOrID? infixExpression?)
;
public prefixExpression
: prefixCharacter? simpleExpression -> ^(R__PrefixExpression prefixCharacter? simpleExpression)
;
public prefixCharacter
: '-' | '+' | '~' | '!' | '#'
;
public simpleExpression
: constant
;
私はinfixExpressionルールを変更した場合:
public infixExpression
: prefixExpression (symbolOrID infixExpression)? -> ^(R__InfixExpression prefixExpression symbolOrID? infixExpression?)
;
そして、それは代わりに文句:
warning(200): Hydra.g3:108:26: Decision can match input such as "{ID, Symbol} {'!'..'#', '+', '-', '~'} String" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
warning(200): Hydra.g3:108:26: Decision can match input such as "{ID, Symbol} {'!'..'#', '+', '-', '~'} Number" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
warning(200): Hydra.g3:108:26: Decision can match input such as "{ID, Symbol} {'!'..'#', '+', '-', '~'} Boolean" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
warning(200): Hydra.g3:108:26: Decision can match input such as "{ID, Symbol} {'!'..'#', '+', '-', '~'} Regex" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
warning(200): Hydra.g3:108:26: Decision can match input such as "{ID, Symbol} {'!'..'#', '+', '-', '~'} Null" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
最後に、方法があります条件付きでAST内にノードを作成して、ルールの左部分だけが真である場合にはそれを追加しないようにするのレベルですか?例:現在作成されたASTは、この式のためで解析されexpresionは、a || b
ある場合
conditional_and_expression
conditional_or_expression
null_coalescing_expression
:のように
conditional_or_expression:
conditional_and_expression ('||' conditional_or_expression)?
;
は、私のような階層構造を次の文法を作成して言うことができます
conditional_and_expression
conditional_or_expression
conditional_or_expression
の部分を取得するにはどうすれば入手できますか? JavaCCので
、あなただけ例えば、ノードアリティを設定することができます。:#ConditionalOrExpression(>1)
EDIT:それは、中置式が今修正properyで、少し遅れての最後の夜でした!
最終編集:私はそれが最終的に動作するようになった方法は、以下のルールだった:
public symbolOrID
: ID
| Symbol
;
public postfixExpression
: infixExpression (symbolOrID^)?
;
public infixExpression
: (prefixExpression symbolOrID)=> prefixExpression symbolOrID^ infixExpression
| prefixExpression
;
public prefixExpression
: prefixCharacter^ simpleExpression
| simpleExpression
;
public prefixCharacter
: '-' | '+' | '~' | '!' | '#'
;
public simpleExpression
: constant
;
ルールは左再帰されていません。あなたはあなたの質問を編集し、あなたが言及したエラーを示す変更なしで、私または他の誰かが実行できる完全な文法を提供できますか?そして、私はあなたが "条件付きでノードを作る"ことが何を意味するのか分かりません。そして、あなたは 'infixExpression'ルールを2回投稿しました(あなたはそれについて何も変更しませんでした...)。 –
残念ながら、これは言語にとっては非常に重要ですが初期の段階ですので、文法の秘密の詳細を徹底的に守らなければなりません。それが実装されたら、私はオープンソースを公開しようとしていますが、 – Darkzaelus