antlr树解析器语法改写规则 *



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

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)

等等。
第一个整数确定将有多少对整数。问题是我将如何在解析器语法中访问这些整数输入,如何在上面的println语句中打印它们?

请参阅我的问题Antlr Java测试文件无法为我编写的完整语法创建树语法对象。

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

解析器语法

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

树语法

transitions
 : ^(TRANSITIONS INT pair+) {System.out.println("transitions.INT=" + $INT.text);}
 ;
pair
 : ^(PAIR a=INT b=INT) {System.out.println("pair=" + $a.text + ", " + $b.text);}
 ;

编辑

快速演示:

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 =过渡有4个儿童节点: -Child1 = 3 -Child2 =(对5 0) -Child3 =(对5 1) -Child4 =(对5 1)secondvaluefromlastpair = 2 

最新更新