【问题标题】:Hidden token into default channel - AntlrV3将令牌隐藏到默认频道 - AntlrV3
【发布时间】:2010-02-03 09:48:29
【问题描述】:

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

【问题讨论】:

    标签: parsing whitespace antlr token hidden


    【解决方案1】:

    查看您的路径问题的答案,注意我是如何将 '\n' 放入解析器规则的。您也应该可以输入 ' '。现在,您的 WS 在隐藏频道上的所有选项都需要在规则中是唯一的问题。

    例如

    rulename : Token1 ' ' Token2 ' ' Token1 {place action here};
    

    请注意,规则名称以小写字母开头,是解析器规则,而“Token#”以大写字母开头,是词法分析器规则。在此示例中,在不同的标记之间,规则需要一个空格,我想您可以放置​​类似 (' '|'\t'|'\r'|'\n')+ 的内容,但我没有尝试过,并且会留给你尝试。

    【讨论】:

      【解决方案2】:

      您可以随时查询隐藏的令牌流

      即在 C++ 中

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

      语义谓词在匹配词法标记MYTOK后会检查是否有空格标记

      【讨论】:

        【解决方案3】:

        词法分析器规则按照它们在您的语法文件中列出的顺序进行评估。

        这意味着你可以拥有这样的东西:

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

        【讨论】:

        • Darien 说得好,但我认为他希望空格作为规则的一部分,而不是词汇标记。即rule: rule1 WS rule2 不是TOKEN_WITH_WS
        猜你喜欢
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 2021-11-11
        • 2021-12-01
        • 1970-01-01
        相关资源
        最近更新 更多