ANTLR:带参数的规则?

San*_*jiv 2 java antlr antlr3

我是ANTLR的新手.我开始探索ANTLR教程.我已经看到了为特定规则定义了返回类型的示例(参见下面的示例).

我也可以将争论传递给统治吗?我只是想到了,我想根据提供给它的论点改变一个微观状态的规则行为.

如果它在ANTLR中可以通过,请帮帮我,还是这样做是个好主意?

atom returns [int value]
 :
  INT 
     {
      $value = Integer.parseInt($INT.text);
     }
  | ID // variable reference
     {
      Integer v = (Integer) memory.get($ID.text);
      if (v != null)
        $value = v.intValue();
     }
;
Run Code Online (Sandbox Code Playgroud)

Bar*_*ers 6

是的,但是您无法将解析器规则中的参数传递给词法分析器规则:词法分析器独立于解析器构造标记.

规则参数的示例:

parse
 : p1["param"]
 ;

p1 [String s]
 : ref=p2[$s, 42]
   {
     // Print some info about rule 'p2'.
     System.out.println("param=" + $s);
     System.out.println("p2.ss=" + $ref.ss);
     System.out.println("p2.ii=" + $ref.ii);
   }
 ;

// Rules can have more than 1 param, and can even return more than 1 value.
p2 [String s, int i] returns [String ss, int ii]
 : ID
   {
     $ss = $s + "_" + $ID.text;
     $ii = $i + $i;
   }
 ;

ID
 : ('a'..'z')+
 ;
Run Code Online (Sandbox Code Playgroud)

如果您现在解析输入"mu",将在控制台上打印以下内容:

param=param
p2.ss=param_mu
p2.ii=84
Run Code Online (Sandbox Code Playgroud)