【发布时间】:2010-11-11 23:45:21
【问题描述】:
我有以下 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 来简化,但也支持其他类型的 cmets。
【问题讨论】:
-
好吧,我不知道 Antlr,但“doc: intro WHITESPACE planet”或类似的东西不是最明显的吗?
-
由于通道 WHITESPACE 被隐藏,导致 MismatchedTokenException。
-
那你就不能再创建一个不隐藏的空白语法并使用它吗?
-
我可以,我暂时使用你的方法,但是为什么每个教程都建议使用HIDDEN频道或skip()呢?
标签: whitespace antlr channel