lui*_*bal 2 whitespace hidden antlr ignore channel
我有以下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; };
Run Code Online (Sandbox Code Playgroud)
在ANTLRWorks 1.2.3解释器,输入hi world
,hi/**/world
和hi /*A*/ world
工作,符合市场预期.
但是,hiworld
也应该接受不应该起作用的输入.我怎么做hiworld
失败?如何在"hi"和"world"之间强制至少有一个空格(或注释)?
请注意,我在此示例中仅使用了MLCOMMENT和WHITESPACE来简化,但支持其他类型的注释.
您需要创建一个通用ID令牌.由于词法分析器可以构建最长的令牌,因此它将输入"hiworld"视为一个单词,因为它本身比"hi"或"world"更长.这样的规则可能如下:
ID : ('a'..'z' | 'A'..'Z')+;
Run Code Online (Sandbox Code Playgroud)
作为一个例子,这正是编程语言的解析器如何将"do"关键字与"double"(关键字类型,以"do"开头)或"done"(变量名称)分开.