ANTLR隠されたチャネルの空白の問題
-
18-09-2019 - |
質問
私は、次の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 world
、hi/**/world
とhi /*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
所属していません StackOverflow