Parsing 默认通道中的隐藏令牌-AntlrV3

Parsing 默认通道中的隐藏令牌-AntlrV3,parsing,whitespace,antlr,token,hidden,Parsing,Whitespace,Antlr,Token,Hidden,假设在隐藏通道中有空格(WS)。和 对于一个特定的规则,我希望空格也被考虑,是吗 是否可以在解析器中单独将WS带到该特定规则的默认通道?查看路径问题的答案,注意我如何在解析器规则中添加“\n”。您还应该能够放置“”。现在,是否所有隐藏通道上的WS的选项都需要在规则中,这将是唯一需要考虑的问题 乙二醇 请注意,规则名称以小写字母开头,是解析器规则,“Token#”以大写字母开头,是lexer规则。在本例中,在不同的令牌之间,规则需要一个空格,我想您可以放置类似(“|”\t“|”\r“|”\n“+)

假设在隐藏通道中有空格(WS)。和 对于一个特定的规则,我希望空格也被考虑,是吗
是否可以在解析器中单独将WS带到该特定规则的默认通道?

查看路径问题的答案,注意我如何在解析器规则中添加“\n”。您还应该能够放置“”。现在,是否所有隐藏通道上的WS的选项都需要在规则中,这将是唯一需要考虑的问题

乙二醇


请注意,规则名称以小写字母开头,是解析器规则,“Token#”以大写字母开头,是lexer规则。在本例中,在不同的令牌之间,规则需要一个空格,我想您可以放置类似(“|”\t“|”\r“|”\n“+)的内容,但我没有尝试过,将留给您尝试。

您始终可以查询隐藏的令牌流

ie在C++

myrule: MYTOK { static_cast<antlr::CommonHiddenStreamToken*>(LT(1).get())->getHiddenAfter()->getType() == WS}? MYTOK 
myrule:MYTOK{static_cast(LT(1).get())->getHiddenAfter()->getType()==WS}?麦托克

语义谓词将检查匹配词法标记后是否有空白标记
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;
    }
    ;   

正如您所看到的,字符串文本中可以有空格或制表符。但是,一个独立的空格或制表符将被发送到隐藏频道。

这是一个很好的观点,Darien,但我认为他想要空白作为规则的一部分,而不是词汇标记。ie
rule:rule1 WS rule2
not
TOKEN\u WITH\u WS
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;
    }
    ;