1

我可以用3 INDENT组替换以下语法中的indent_loop[3]吗?其中 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 ))* 没有被调用。

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

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

4

1 回答 1

1

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

grammar T;

parse
 : digit[1] digit[2] digit[3] EOF
 ;

digit[int amount]
 : ({amount > 0}?=> DIGIT {amount--;})*
 ;

DIGIT
 : '0'..'9'
 ;

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

在此处输入图像描述

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


1 ANTLR 中的“语义谓词”是什么?
2 ANTLR 像缩进依赖语法那样实现python的最简单方法是什么?

于 2012-06-05T07:59:12.577 回答