我有以下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
失败?如何在“hi”和“world”之间强制至少有一个空格(或注释)?
请注意,我在此示例中仅使用了MLCOMMENT和WHITESPACE来简化,但支持其他类型的注释。
答案 0 :(得分:6)
您需要创建一般ID标记。由于词法分析器可以构建最长的令牌,因此它将输入“hiworld”视为一个单词,因为它比“hi”或“world”本身更长。这样的规则可能如下:
ID : ('a'..'z' | 'A'..'Z')+;
作为一个例子,这就是编程语言的解析器如何将“do”关键字与“double”(关键字类型,以“do”开头)或“done”(变量名称)分开。
答案 1 :(得分:0)
使字符串hiworld
失败的一种方法是使用保证失败的验证语义谓词,如下所示:
doc: intro planet;
failure : 'hiworld' { false }?;
intro : 'hi';
planet : 'world';
// rest of grammar omitted