Java 的ANTLR树解析器语法重写规则*

Java 的ANTLR树解析器语法重写规则*,java,antlr,dsl,parser-generator,Java,Antlr,Dsl,Parser Generator,我有一个树语法,部分语法如下所示 transitions :'transitions' '=' INT ('(' INT ',' INT ')') + ';' -> ^(TRANSITIONS INT INT INT*) ; 这是树解析器语法的相应部分 transitions :^(TRANSITIONS INT INT INT*) {System.out.println("");} ; 我使用了+重写规则,基本上就是重写。在上面的语法中,用户输

我有一个树语法,部分语法如下所示

transitions
    :'transitions' '=' INT ('(' INT ',' INT ')') + ';' -> ^(TRANSITIONS INT INT INT*)
    ;
这是树解析器语法的相应部分

transitions
    :^(TRANSITIONS INT INT INT*)
    {System.out.println("");}
    ;
我使用了+重写规则,基本上就是重写。在上面的语法中,用户输入至少3个整数值,例如 一个可能的输入

  transitions 1 (5,0)
第二种可能的输入

transitions 2 (5,0) (5,1)
transitions 3 (5,0) (5,1) (5,2)
第三种可能的输入

transitions 2 (5,0) (5,1)
transitions 3 (5,0) (5,1) (5,2)
等等。
第一个整数决定将有多少对整数。问题是如何在解析器语法中访问这些整数输入,以及如何在上面的println语句中打印这些整数输入

关于我所写的完整语法,请参考我的问题

我建议您将数字的“对”保留在单独的规则中:

语法分析器 树语法 编辑 快速演示:

grammar T;

options {
  output=AST;
  ASTLabelType=CommonTree;
}

tokens {
  TRANSITIONS;
  PAIR;
}

parse
 : transitions EOF!
   {
     CommonTree root = $transitions.tree;

     int count = root.getChildCount();

     Tree child1 = root.getChild(0);
     Tree child2 = root.getChild(1);
     Tree child3 = root.getChild(2);
     Tree child4 = root.getChild(3);

     System.out.println("root=" + root.getToken().getText() + " has " + count + " child nodes:");
     System.out.println(" - child1=" + child1.toStringTree());
     System.out.println(" - child2=" + child2.toStringTree());
     System.out.println(" - child3=" + child3.toStringTree());
     System.out.println(" - child4=" + child3.toStringTree());

     String secondValueFromLastPair = child4.getChild(1).getText();
     System.out.println("\nsecondValueFromLastPair=" + secondValueFromLastPair);
   }
 ;

transitions
 : 'transitions' '=' INT pair+ ';' -> ^(TRANSITIONS INT pair+)
 ;

pair
 : '(' INT ',' INT ')' -> ^(PAIR INT INT)
 ;

INT   : '0'..'9'+;
SPACE : ' ' {skip();};
如果您现在解析输入
“transitions=3(5,0)(5,1)(5,2);”
,您将看到以下内容打印到控制台:

root=TRANSITIONS has 4 child nodes: - child1=3 - child2=(PAIR 5 0) - child3=(PAIR 5 1) - child4=(PAIR 5 1) secondValueFromLastPair=2 root=转换有4个子节点: -儿童1=3 -child2=(第5对0) -child3=(第5对1) -child4=(第5对1)
secondValueFromLastPair=2我想问一下,^(对a=INT b=INT)a和b是标签吗?是的,它工作得很好,但是如果我给出以下输入,比如。转变=3(5,0)(5,1)(5,2);我将如何存储它,以便我的AST包含PAIR0=(5,0)PAIR1=(5,1)PAIR2=(5,2)@RizwanAbbasi,它已经这样存储了。
transitions
规则生成一个类型为的AST,其根为
transitions
,并且将有4个子节点(也是
CommonTree
):一个
INT
和3个
PAIR
节点你可以看到,我无法区分两对。在上面的java代码(您打印的地方)中,我如何以以下方式访问整数(不知何故)PAIR0(g0,a0)PAIR1(g1,a1)PAIR2(g2,a2)谢谢you@RizwanAbbasi,当然可以:树是
(TRANSITIONS 3(PAIR 50)(PAIR 51)(PAIR 52))
,因此具有根
TRANSITIONS
的AST有4个子节点:
3
(第50对)
(第51对)
(第52对)
。现在,您需要做的就是查看API,看看如何获得节点的子节点(提示:我在前面的评论中发布了一个指向
CommonTree
API的链接)。祝你好运。非常感谢你的支持。