假设我在隐藏频道中有空格(WS)。和 对于一个特定的规则,我想要考虑白色空间,是 是否可以在解析器中单独将WS引入该特定规则的默认通道?
答案 0 :(得分:0)
查看路径问题的答案,注意我如何将'\ n'放入解析器规则中。你应该也能把''。现在,隐藏通道上的WS的所有选项都需要在规则中,这是唯一的问题。
例如
rulename : Token1 ' ' Token2 ' ' Token1 {place action here};
请注意,规则名称以小写字母开头,它是解析器规则,而“Token#”以大写字母开头,是词法规则。在不同的令牌之间,规则在这个例子中需要一个空格,我想你可以放一些类似的东西(''''\ t'|'\ r'|'\ n')+但是我没试过这个并且会留下让你尝试。
答案 1 :(得分:0)
您始终可以查询隐藏的令牌流
即在C ++中
myrule: MYTOK { static_cast<antlr::CommonHiddenStreamToken*>(LT(1).get())->getHiddenAfter()->getType() == WS}? MYTOK
语义谓词将在匹配词法标记MYTOK
答案 2 :(得分:0)
Lexer规则按照语法文件中列出的顺序进行评估。
这意味着您可以拥有以下内容:
STRING_LITERAL: '"' NONCONTROL_CHAR* '"';
fragment NONCONTROL_CHAR: LETTER | DIGIT | UNDERSCORE | SPACE | BACKSLASH | MINUS | COMMA;
fragment LETTER: LOWER | UPPER;
fragment LOWER: 'a'..'z';
fragment UPPER: 'A'..'Z';
fragment DIGIT: '0'..'9';
fragment SPACE: ' ' | '\t';
fragment UNDERSCORE: '_';
fragment MINUS: '-';
fragment BACKSLASH: '\\';
COMMA: ',';
NEWLINE: ('\r'? '\n')+ { $channel = HIDDEN; };
TERMINATOR : ';';
WHITESPACE: SPACE+ { $channel = HIDDEN; };
LINE_COMMENT
:
'//' ~('\n'|'\r')* ('\r\n' | '\r' | '\n')
{
$channel = HIDDEN;
}
|
'//' ~('\n'|'\r')*
{
$channel = HIDDEN;
}
;
如您所见,字符串文字可以包含空格或制表符。但是,一个独立的空间或标签将被发送到HIDDEN频道。