postfix、infix、および prefix ルールを EBNF 形式の scala から ANTLR に変換しようとしていますが、infixExpression ルールの左再帰に関連するエラーが表示されます。
問題のルールは次のとおりです。
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 にノードを作成して、ルールの左側の部分だけが true の場合にそのレベルを追加しないようにする方法はありますか? 例えば:
conditional_or_expression:
conditional_and_expression ('||' conditional_or_expression)?
;
のように、次のような階層に従う文法を作成するとしましょう。
conditional_and_expression
conditional_or_expression
null_coalescing_expression
解析される式が である場合a || b
、現在作成される AST はこの式に対して
conditional_and_expression
conditional_or_expression
部品だけを取得するにはどうすればよいconditional_or_expression
ですか?
JavaCC では、次のようにノード アリティを設定できます。#ConditionalOrExpression(>1)
編集: 昨夜は少し遅くなりましたが、中置式が適切に変更されました!
最終編集:最終的に機能させる方法は、次のルールでした。
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
;