antlr4 - español - antlr python
Antlr4 oyentes y visitantes: ¿qué implementar? (3)
Estoy leyendo "The Definitive Antlr 4 Reference" y entiendo la idea en relación a cómo trabajan los Oyentes y los Visitantes. El libro explica muy bien cómo los oyentes se relacionan con los analizadores SAX y lo hace obvio cuando se llamarán los métodos durante la implementación de cada uno. También puedo ver que los oyentes son bastante buenos para transformar la entrada en salida, pero agradecería una breve explicación / ejemplo sobre cuándo usar un Oyente y cuándo usar un Visitante (¿o deberían usarse ambos en ciertos casos?).
Mi intención particular es crear un intérprete (Cucumber-style / TinyBasic Interpreter con algunas llamadas personalizadas) que compruebe los errores de sintaxis y deje de ejecutar un error de una función personalizada sin recuperar. Me encantaría ver una implementación completa de tal cosa. en antlr, si alguien sabe de uno.
Gracias de antemano por cualquier consejo.
Aquí hay una cita del libro que creo que es relevante:
La mayor diferencia entre el oyente y los mecanismos de visitante es que los métodos de escucha son invocados por el objeto walker proporcionado por ANTLR, mientras que los métodos de visitante deben guiar a sus hijos con visitas explícitas. Olvidarse de invocar visit () en los hijos de un nodo significa que esos subárboles no se visitan.
En el patrón de visitante, usted tiene la capacidad de dirigir la caminata de árbol mientras que en el oyente solo está reaccionando al andador de árbol.
Hay otra diferencia importante entre estos dos patrones: un visitante usa la pila de llamadas para administrar recorridos de árbol, mientras que el oyente usa una pila explícita asignada en el montón, administrada por un andador. Esto significa que las entradas grandes a un visitante podrían apagar la pila, mientras que un oyente no tendría problemas.
Si sus entradas pueden ser potencialmente ilimitadas, o puede llamar a su visitante muy profundamente en un árbol de llamadas, debe utilizar un Oyente, en lugar de un Visitante, o al menos validar que el árbol de análisis no es demasiado profundo. Algunas prácticas de codificación de algunas empresas desalientan o incluso prohíben directamente la recursión sin cola por este motivo.
Si planea usar directamente la salida del analizador para la interpretación, el visitante es una buena opción. Usted tiene el control total del recorrido, por lo que en condicionales solo se visita una rama, los bucles se pueden visitar n veces, y así sucesivamente.
Si traduce la entrada a un nivel inferior, por ejemplo, las instrucciones de la máquina virtual, ambos patrones pueden ser útiles.
Puede consultar "Patrones de implementación del lenguaje", que cubre las implementaciones básicas del intérprete.
Uso principalmente el patrón de visitante, ya que es más flexible.