写在之前
我们曾经介绍过这样一种情况:
忽略空白和注释,但在必要的时候也能调用他们。我们的处理方法是:
那么这次,我们尝试将空白和注释放在多个
Channel中。
之后我们会用一个例子演示如何读取
在隐藏Channel中的信息。
将空白和注释放到不同的Channel中
注意在最新的版本中,以下这种方法已经过时了。
@lexer::members {
public static final int WHITESPACE = 1;
public static final int COMMENTS = 2;
}
...
WS : [ \t\n\r]+ -> channel(WHITESPACE) ; // channel(1)
SL_COMMENT
: '//' .*? '\n' -> channel(COMMENTS) // channel(2)
;
方便起见,我们会直接用数字
指定隐藏Channel,而不是标识符
。
语法文件
我们只列举了需要的部分,即语法文件入口file
,语法规则varDecl
(变量声明语句),以及空白
词法和注释
词法。
可以观察到,我们将空白词法移到了Channel1
,将注释词法移到了Channel2
。(注意默认的Channel是Channel0
,其它的Channel都是HIDDEN
类型)
//Cymbol.g4
grammar Cymbol;
file: (functionDecl | varDecl)+ ;
varDecl
: type ID ('=' expr)? ';'
;
...
WS : [ \t\n\r]+ -> channel(1) ; // channel(1)
SL_COMMENT
: '//' .*? '\n' -> channel(2