假设我在隐藏通道中有空格 (WS)。并且仅对于特定规则,我还希望考虑空格,是否可以在解析器中单独将 WS 带入该特定规则的默认通道?
问问题
503 次
3 回答
0
看看你的路径问题的答案,注意我是如何在解析器规则中加入 '\n' 的。您也应该可以输入 ' '。现在,您的 WS 在隐藏频道上的所有选项都需要在规则中,这将是唯一的问题。
例如
rulename : Token1 ' ' Token2 ' ' Token1 {place action here};
请注意,规则名称以小写字母开头,是解析器规则,而“Token#”以大写字母开头,是词法分析器规则。在此示例中,规则在不同的标记之间需要一个空格,我想您可以放置类似 (' '|'\t'|'\r'|'\n')+ 的内容,但我没有尝试过,并且会留给你尝试。
于 2010-02-03T16:29:51.767 回答
0
词法分析器规则按照它们在语法文件中列出的顺序进行评估。
这意味着你可以拥有这样的东西:
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;
}
;
如您所见,字符串文字中可以包含空格或制表符。然而,一个独立的空格或标签将被发送到隐藏通道。
于 2010-02-03T21:03:25.227 回答
0
您可以随时查询隐藏的令牌流
即在 C++ 中
myrule: MYTOK { static_cast<antlr::CommonHiddenStreamToken*>(LT(1).get())->getHiddenAfter()->getType() == WS}? MYTOK
语义谓词在匹配词法记号后会检查是否有空格记号MYTOK
于 2010-02-03T20:03:44.090 回答