2014-02-13 2 views
2

Я новичок в ANTLR. Я начал изучать учебники 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(); 
    } 
; 

ответ

6

Да, но вы не можете передать параметры из правила синтаксического анализатора в правило LeXeR: лексер создает маркеры независимо от синтаксического анализатора.

Пример параметров правила:

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')+ 
; 

Если бы в настоящее время разобрать вход "mu", следующее будет выведено на консоль:

param=param 
p2.ss=param_mu 
p2.ii=84 
+0

Имейте в виду, что каждое использование этого функция сделает переход к ANTLR 4 более сложным, когда использование заданных пользователем аргументов и возвращаемых значений в грамматике в лучшем случае «обескуражено». –