6

ANTLR の使い方を学ぶために非常に単純な文法を作成しようとしていますが、次のメッセージが表示されます。

「次の選択肢には決して到達できません: 2」

これは私の文法の試みです:

grammar Robot;

file    :   command+;
command :   ( delay|type|move|click|rclick) ;
delay   :   'wait' number ';';
type    :   'type' id ';';
move    :   'move' number ',' number ';';
click   :   'click' ;
rclick  :   'rlick' ;
id  :       ('a'..'z'|'A'..'Z')+ ;
number  :       ('0'..'9')+ ;
WS  :   (' ' | '\t' | '\r' | '\n' ) { skip();} ;

IDEA 用の ANTLRWorks プラグインを使用しています。

これはそれがどのように見えるかです

4

1 に答える 1

4

パーサー規則内の..(範囲) は、レクサー規則内とは異なる意味を持ちます。レクサー規則内では、「文字 X から文字 Y まで」を意味し、パーサー規則内では「トークン M からトークン N まで」に一致します。またnumber、パーサー ルールを作成したため、思ったとおりに動作しません (そのため、あいまいなエラー メッセージが表示されます)。

解決策:number代わりにレクサー ルールを作成します (つまり、大文字にします: Number):

grammar Robot;

file    :   command+;
command :   (delay | type | move | Click | RClick) ;
delay   :   'wait' Number ';';
type    :   'type' Id ';';
move    :   'move' Number ',' Number ';';
Click   :   'click' ;
RClick  :   'rlick' ;
Id      :   ('a'..'z'|'A'..'Z')+ ;
Number  :   ('0'..'9')+ ;
WS      :   (' ' | '\t' | '\r' | '\n') { skip();} ;

ご覧のとおり、代わりにid,clickおよびrclicklexer ルールも作成しました。パーサー ルールとレクサー ルールの違いがわからない場合は、そう言ってください。この回答に説明を追加します。

于 2011-06-10T19:36:30.037 に答える