【问题标题】:ANTLR return group of lexical rules?ANTLR 返回一组词法规则?
【发布时间】:2012-06-04 23:32:49
【问题描述】:

我可以将以下语法中的 indent_loop[3] 替换为 3 个 INDENT 的组吗? 其中 INDENT 是缩进的词法规则。

我只想根据数字写出 INDENT 的数字。

match_node
        :   match_node_name (tree_operator) (NEW_LINE (indent_loop[3]) ( moduleCall | literals ))*
            { match_node_list.push($match_node_name.text); }
        |   SINGLE_QUOTE POINTE SINGLE_QUOTE 
        ;


    match_node_name
        :   IDENT_SMALL_LETTERS
        ;

    indent_loop[int scope]
        :   {scope == 3}? INDENT INDENT INDENT  
        |   {scope == 4}? INDENT INDENT INDENT INDENT   
        ;

    INDENT :  '\t';

当我这样做时,我无法回到我的调用规则并且无法返回这组缩进? 意思是,( moduleCall | literals ))* 没有被调用。

我哪里错了?我才刚刚开始。

或者有没有其他方法可以做到这一点?

【问题讨论】:

    标签: compiler-construction antlr interpreter rules antlr3


    【解决方案1】:

    您可以通过使用语义谓词来做到这一点1

    grammar T;
    
    parse
     : digit[1] digit[2] digit[3] EOF
     ;
    
    digit[int amount]
     : ({amount > 0}?=> DIGIT {amount--;})*
     ;
    
    DIGIT
     : '0'..'9'
     ;
    

    使用从上述语法生成的解析器解析"456789",将产生以下解析:

    请注意,在您的情况下,您只是匹配一个制表符,不一定是缩进(即从行首开始的一个或多个制表符)。如果您只想从行首匹配缩进,(恕我直言)最简单的方法是在词法分析器中处理它们2


    1What is a 'semantic predicate' in ANTLR?
    2ANTLR What is simpliest way to realize python like indent-depending grammar?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多