2017-10-09 1 views
1

で二回表示され、この単純なガンマR入力にANTLRエラーが私のpythonをantlr4使用しています代替

emptytest : (COMMA | empty empty nonempty) EOF ; 
empty  : SEMICOLON* ; 
nonempty : DOT+ ; 
DOT   : '.' ; 
SEMICOLON : ';' ; 
COMMA  : ',' ; 

「...」との奇妙な何かに実行し、私はエラーに ラインを得ました1:0の不一致の入力 '。' {';'、 '、'}を期待しています

しかし、私が「空」をドロップしたり、「COMMA |」をドロップしたりすると、ルールから、エラーはありません。

なぜ入力 '...'が空(= '')空(= '')空ではないと思うのですか?

ありがとうございます。

答えて

0

あなたの文法はあいまいです - 入力;.の場合、セミコロンは最初のemptyまたは2番目のemptyのいずれかと一致する可能性があります。

このような状況では、ANTLRはいくつかの選択肢を無視することによってあいまいさを解決しようとします。この場合、emptyが出現しないことを無視してSEMICOLON(すなわち、実際には空である)という曖昧さを解決したようである。これはemptyルールのすべての用途に適用されるため、.は有効な入力と見なされません。

文法があいまいであれば、パーサーがうまく動作することは期待できません。 ANTLRは、曖昧さについて警告します(バージョン3では、パーサーの生成時に警告しますが、バージョン4についてはわかりません)。

+0

ありがとうございます。しかし、あいまいさについての警告はありません。私が見たのは –

+0

です。説明をありがとう。しかし、入力に「...」のあいまいさがないので、あいまいさに関する警告はありません。 しかし、たとえあいまいであったとしても、正当な入力に失敗するのではなく、警告とともに、Antlrが可能性の1つに沿って解析する方が合理的です。実際問題として、私が使用するAntlr4は、あいまいで最初の選択肢を選んだようなものです:入力 '; ...'では、この解析木が生成されました。 (emptytest(空;)空(空ではありません。))警告なし –

関連する問題