ANTLR返回词汇规则组?

时间:2012-06-04 23:32:50

标签: compiler-construction antlr interpreter rules antlr3

我可以将以下语法中的 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))*没有被调用。

我哪里错了?我刚开始。

或者还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用语义谓词 1

来实现
grammar T;

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

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

DIGIT
 : '0'..'9'
 ;

使用从上面的语法生成的解析器解析"456789"将导致以下解析:

enter image description here

请注意,在您的情况下,您只是匹配一个标签,不一定是缩进(即一行开头的一个或多个标签)。如果您只想匹配行开头的缩进,(IMHO)最简单的方法是在词法分析器 2 中处理它们。


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