質問

私は、次のANTLR文法を持っています:

grammar MyGrammar;

doc :   intro planet;
intro   :   'hi';
planet  :   'world';
MLCOMMENT 
    :   '/*' ( options {greedy=false;} : . )* '*/' { $channel = HIDDEN; };
WHITESPACE : ( 
    (' ' | '\t' | '\f')+
  |
    // handle newlines
    ( '\r\n'  // DOS/Windows
      | '\r'    // Macintosh
      | '\n'    // Unix
    )
    )
 { $channel = HIDDEN; };

ANTLRWorks 1.2.3インタプリタ、入力hi worldhi/**/worldhi /*A*/ world作業において、予想通り。

ただし、を入力hiworldは、の作業は、も受け入れられてはなりません。 どのように私はhiworldは失敗するのですか?どのように私は「こんにちは」と「世界」との間に少なくとも1つの空白文字(またはコメント)を強制できますか?

私は簡単にするために、この例では唯一のMLCOMMENTや空白を使用しましたが、コメントの他の種類がサポートされることに注意してください。

役に立ちましたか?

解決

あなたは、一般的なIDトークンを作成する必要があります。レクサーはそれができる最長のトークンを構築しますので、それは、それ自体で「こんにちは」や「世界」よりも長いですので、一つの単語として入力「hiworld」を参照してくださいます。このようなルールは次のようになります。

ID : ('a'..'z' | 'A'..'Z')+;

例として、それはプログラミング言語のためのパーサは「ダブル」(キーワードタイプ、「を実行」で始まる)または「完了」(変数名)から「やる」というキーワードを分離正確にどのようだ。

他のヒント

の文字列hiworldを失敗させるための一つの方法は、以下のように、失敗することが保証されて、検証セマンティック述語を使用することです。

doc:      intro planet;
failure : 'hiworld' { false }?;
intro   : 'hi';
planet  : 'world';
// rest of grammar omitted
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top