23 Modos de diseño Capítulo 15: Modo de intérprete Java
Definición: Dado un lenguaje, defina una representación de su gramática y defina un intérprete que use la representación para interpretar las oraciones en el idioma.
Tipo: Patrón de comportamiento
Diagrama de clases:
El modo de intérprete es un modo relativamente usado raramente, y nunca antes había usado este modo. Echemos un vistazo al modo intérprete.
Estructura del modo intérprete
Intérprete de resumen: declare una interfaz abstracta (o clase abstracta) a la que se implementarán todas las expresiones concretas. La interfaz es principalmente un método interpret (), llamado operación de explicación. La tarea de interpretación específica se completa con sus diversas clases de implementación, y el intérprete específico es completado por el intérprete Terminator TerminalExpression y el intérprete no terminal no terminalaxpression respectivamente.
Expresión de Terminator: implementa operaciones de interpretación asociadas con elementos en gramática. Por lo general, solo hay una expresión de terminador en un patrón de intérprete, pero hay múltiples instancias, correspondientes a diferentes terminadores. La mitad del terminador es una unidad de operación en la gramática. Por ejemplo, hay una fórmula simple R = R1+R2, donde R1 y R2 son terminadores, y los intérpretes correspondientes que analizan R1 y R2 son terminadores.
Expresión no terminal: cada regla en la gramática corresponde a una expresión no terminal. Las expresiones no terminales son generalmente operadores u otras palabras clave en la gramática. Por ejemplo, en la fórmula R = R1 + R2, + es un carácter no terminal, y el intérprete de análisis + es un carácter no terminal. Las expresiones no terminales aumentan de acuerdo con la complejidad de la lógica, y en principio cada regla de gramática corresponde a una expresión no terminal.
Rol de entorno: La tarea de este rol generalmente se usa para almacenar los valores específicos correspondientes a cada terminador en la gramática, como R = R1+R2. Asignamos 100 a R1 y 200 a R2. Esta información debe almacenarse en el rol del medio ambiente. En muchos casos, usamos MAP para actuar como el rol de entorno es suficiente.
Implementación del código
contexto de clase {} expresión de clase abstracta {intérprete de objeto abstracto público (context CTX); } class TerminalExpression extiende la expresión {Public Object Interpreter (context ctx) {return null; }} clase no terminalAxpression extiende la expresión {public no terminalAxpression (expresión ... expresiones) {} public objeto intérprete (context ctx) {return null; }} Public Class Client {public static void main (string [] args) {String Expression = ""; char [] chararray = expresion.toCarArray (); Contexto ctx = nuevo context (); Pila <express> stack = new Stack <Extion> (); for (int i = 0; i <chararray.length; i ++) {// hacer juicio de sintaxis y llamar recursivamente} expresión exp = stack.pop (); exp.interpreter (CTX); }}La parte del código de la recursión gramatical debe implementarse de acuerdo con la situación específica, por lo que no se refleja en el código. Las expresiones abstractas son la clave para generar una colección gramatical. Cada expresión no terminal interpreta una unidad de sintaxis mínima, y luego combina recursivamente estas unidades de sintaxis en una gramática completa. Este es el patrón de intérprete.
Ventajas y desventajas del modo intérprete
El intérprete es una herramienta simple de análisis de sintaxis. Su ventaja más significativa es su extensibilidad. Modificar las reglas de sintaxis solo requiere modificar los caracteres no terminales correspondientes. Si amplía la sintaxis, solo necesita agregar un carácter no terminal.
Sin embargo, el patrón de intérprete hará que la clase se expanda, y cada sintaxis necesita producir una expresión no terminal. Cuando las reglas de sintaxis son relativamente complejas, se puede generar una gran cantidad de archivos de clase, lo que trae muchos problemas al mantenimiento. Al mismo tiempo, dado que se adopta el método de llamada recursiva, cada expresión no terminal solo se preocupa por las expresiones relacionadas con sí misma. Cada expresión necesita conocer el resultado final y debe ser recursivo. Ya sea que se trate de un lenguaje orientado a objetos o un lenguaje orientado al proceso, la recursión es una forma no recomendada. Debido al uso de muchos bucles y recursión, la eficiencia es un problema que no se puede ignorar. Especialmente cuando se usa para interpretar una sintaxis compleja de análisis, la eficiencia es insoportable.
Escenarios aplicables para el modo intérprete
El modo de intérprete se puede usar en los siguientes casos:
Hay una regla de sintaxis simple, como una declaración SQL. Si necesitamos realizar una conversión de RM basada en las declaraciones SQL, podemos usar el patrón de intérprete para interpretar la declaración.
Algunos problemas repetitivos, como las cuatro operaciones de suma, resta, multiplicación y división, pero las fórmulas son diferentes cada vez. A veces es A+BC*D, a veces es un CD*B+, etc. Las fórmulas están siempre cambiantes, pero todas están conectadas por los cuatro caracteres no terminales de suma, resta, multiplicación y división. En este momento, podemos usar el modo intérprete.
Cosas a tener en cuenta
El modo intérprete es realmente un modo relativamente usado rara vez porque es demasiado problemático para mantenerlo. Imagine que si un grupo de intérpretes no terminales no está familiarizado con las reglas de la gramática de antemano, o la gramática es particularmente simple, será difícil entender su lógica. El modo de intérprete rara vez se usa en el desarrollo real del sistema porque puede causar problemas como la eficiencia, el rendimiento y el mantenimiento.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.