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