2012-05-16 10 views
8

¿Cuál preferiría declarar una variable en cuyo caso, alcance global o declaración @members? Me parece que pueden servir para el mismo propósito?antlr declaración de alcance de regla global contra @ declaración de miembros

ACTUALIZACIÓN aquí hay una gramática para explicar lo que quiero decir.

grammar GlobalVsScope; 

scope global{ 
    int i; 
} 
@lexer::header{package org.inanme.antlr;} 
@parser::header{package org.inanme.antlr;} 

@parser::members { 
    int j; 
} 

start 
scope global; 
@init{ 
    System.out.println($global::i); 
    System.out.println(j); 
}:R EOF; 

R:'which one'; 
+0

eche un vistazo a la gramática de ejemplo. –

+0

Ah, no el * scope * de la lengua de destino, pero * ANTLR- * scopes *. Entiendo. –

Respuesta

9

Nota que además de alcances globales (ANTLR), también puede tener locales regla-ámbitos, como esto:

grammar T; 

options { backtrack=true; } 

parse 
scope { String x; } 
parse 
: 'foo'? ID {$parse::x = "xyz";} rule* 
| 'foo' ID 
; 

rule 
: ID {System.out.println("x=" + $parse::x);} 
; 

La única vez que me gustaría considerar el uso local de regla- ámbitos es cuando hay muchos predicados, o se habilita el rastreo global (resultando en todas las reglas para tener predicados delante de ellas). En ese caso, podría crear una variable miembro String x (o definirla en un ámbito global) y configurarla en la regla parse, pero podría estar cambiando esta variable de instancia/ámbito después de la cual el analizador podría dar marcha atrás, y esto retrocediendo ¡no causa que la variable global se configure en su forma/estado original! La variable de ámbito local también será no estar "unset", pero probablemente sea un riesgo menor: son locales a una única regla.

En resumen: sí, tiene razón, los ámbitos globales y las variables miembro/instancia son muy similares. Pero preferiría optar por variables de miembros debido a la sintaxis más amigable.

+0

aún digiriendo, ¡muchas gracias! –

+0

@mertinan, lo siento, mi respuesta anterior no fue del todo correcta (y un poco vaga, tal vez). Ver mi versión editada –

Cuestiones relacionadas