1

假设我在隐藏通道中有空格 (WS)。并且仅对于特定规则,我还希望考虑空格,是否可以在解析器中单独将 WS 带入该特定规则的默认通道?

4

3 回答 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 回答