Pregunta

¿Cuál es la forma correcta de resolver este problema en antlr:

Tengo una regla gramatical sencilla, digamos por una lista con un número arbitrario de elementos.

list
: '[]' 
| '[' value (COMMA value)* ']'

Si quería asignar un valor a cambio de lista, y tienen ese valor sea la lista real de los valores devueltos por la producción, ¿cuál es la forma correcta de hacerlo? Las alternativas que estoy entreteniendo son:

  • crear mi propia pila en el ámbito global para realizar un seguimiento de estas listas
  • Trate de inspeccionar los nodos del árbol debajo de mí y extraer información de esa manera
  • Acceso de alguna mancha y fresca manera que yo estoy esperando para averiguar sobre en el que puedo obtener un fácil acceso a una lista de este tipo desde el interior de la acción asociada a la regla.

Supongo que la pregunta es:? ¿Cómo los niños frescos lo hacen

(FYI estoy usando la API de Python para antlr, pero si me pegas con otro idioma, puedo manejar eso)

¿Fue útil?

Solución

En C # que podría tener este aspecto:

list returns [ List<string> ValueList ]
    @init
    {
        $ValueList = new List<string>();
    }
    : '[]'
    | '[' value {$ValueList.Add(value);} (COMMA value {$ValueList.Add(value);})* ']'
    ;

Otros consejos

Creo que una manera más sencilla podría ser

list returns [ List values ]
: '[]' 
| '[' vs+=value (COMMA vs+=value)* ']' {
        $values = $vs;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top