¿Cómo lidiar con los valores de la lista de retorno en antlr
-
09-09-2019 - |
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)
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