隐藏的令牌进入默认通道 - AntlrV3

时间:2010-02-03 09:48:29

标签: parsing whitespace antlr token hidden

假设我在隐藏频道中有空格(WS)。和 对于一个特定的规则,我想要考虑白色空间,是 是否可以在解析器中单独将WS引入该特定规则的默认通道?

3 个答案:

答案 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频道。