7

baseClassリスナーを拡張し、いくつかの値を読み込もうとしていますが、順序に階層がないようです。

私の文法の縮小版は次のとおりです。

start: config_options+
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ;

KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;

ただし、この実装の解析ツリーはconfig_optionsレベル(ターミナルレベル)でフラットです。つまり、ルールの開始にはconfig_optionsの子が多数ありますが、EQUALSはconfig_optionsのサブツリーのルートではなく、すべてのTOKENSのルートノードとしてルールconfig_optionsがあります。代わりに、端末の1つをルートノードにするにはどうすればよいですか?

この特定のルールでは、スペースをキャプチャしたくありません。レクサーに向けられた->スキップがあることはわかっていますが、スペースが必要な場合もあります。つまり、文字列'"'(ALPHANUM |'')'"'

(注:^は機能していないようです)

入力の例は次のとおりです。

key = abcdefg

key = 90weata

key = acbefg9

私がやりたいのは、キーと値のペアを抽出することだけです。'='がルートになり、2つの子がキーと値になると思います。

4

1 に答える 1

7

^文法を生成するとき、ANTLR 4で削除された演算子の使用に関して構文エラーが発生するはずです。ANTLR4は解析ツリーを生成し、そのルートは文法のルールによって暗黙的に定義されます。言い換えると、上で指定した文法の場合、解析ツリーノードはとになりstartますconfig_options

生成されconfig_optionsたルールはConfig_optionsContext、次のメソッドを含むのインスタンスを返します。

  • KEY()トークンのTerminalNodeを返します。KEY
  • EQUALS()EQUALSトークンも同じ)
  • PATH()PATHトークンも同じ)
  • ALPHANUM()ALPHANUMトークンも同じ)

を呼び出しgetSymbol()てインスタンスTerminalNodeを取得できます。Token

于 2013-02-21T18:28:53.187 に答える