El análisis sintáctico , también conocido como análisis gramatical , es un proceso que consiste en analizar una cadena de símbolos , ya sea en lenguaje natural , lenguajes informáticos o estructuras de datos , de acuerdo con las reglas de una gramática formal , dividiéndola en partes. El término análisis sintáctico proviene del latín pars ( orationis ), que significa parte (de la oración) . [ 1 ]
El término tiene significados ligeramente diferentes en distintas ramas de la lingüística y la informática . El análisis sintáctico tradicional se realiza a menudo como método para comprender el significado exacto de una oración o palabra, a veces con la ayuda de herramientas como diagramas sintácticos . Generalmente, enfatiza la importancia de las divisiones gramaticales como sujeto y predicado .
En lingüística computacional, el término se utiliza para referirse al análisis formal, realizado por una computadora, de una oración u otra cadena de palabras en sus constituyentes, lo que da como resultado un árbol de análisis sintáctico que muestra su relación sintáctica entre sí, el cual también puede contener información semántica . Algunos algoritmos de análisis sintáctico generan un bosque de análisis sintáctico o una lista de árboles de análisis sintáctico a partir de una cadena sintácticamente ambigua . [ 2 ]
El término también se usa en psicolingüística para describir la comprensión del lenguaje. En este contexto, el análisis sintáctico se refiere a la forma en que los seres humanos analizan una oración o frase (en lenguaje hablado o escrito) "en términos de constituyentes gramaticales, identificando las partes de la oración, las relaciones sintácticas, etc." [ 1 ] Este término es especialmente común cuando se discute qué pistas lingüísticas ayudan a los hablantes a interpretar oraciones ambiguas .
En informática, el término se utiliza para el análisis de lenguajes de programación , refiriéndose al análisis sintáctico del código de entrada en sus componentes para facilitar la escritura de compiladores e intérpretes . El término también puede usarse para describir una división o separación.
En el análisis de datos, el término se usa a menudo para referirse a un proceso que extrae la información deseada de los datos, por ejemplo, la creación de una señal de serie temporal a partir de un documento XML .
Lenguas humanas
Métodos tradicionales
El ejercicio gramatical tradicional del análisis sintáctico, a veces conocido como análisis de cláusulas , implica descomponer un texto en sus partes de la oración componentes con una explicación de la forma, la función y la relación sintáctica de cada parte. [ 3 ] Esto se determina en gran parte a partir del estudio de las conjugaciones y declinaciones del idioma , que pueden ser bastante intrincadas para lenguas con mucha flexión . Para analizar una frase como "el hombre muerde al perro" implica observar que el sustantivo singular "hombre" es el sujeto de la oración, el verbo "morder" es la tercera persona del singular del presente del verbo "morder", y el sustantivo singular "perro" es el objeto de la oración. A veces se utilizan técnicas como los diagramas sintácticos para indicar la relación entre los elementos de la oración.
El análisis sintáctico fue en su momento fundamental para la enseñanza de la gramática en todo el mundo angloparlante, y se consideraba básico para el uso y la comprensión del lenguaje escrito.
Métodos computacionales
En algunos sistemas de traducción automática y procesamiento del lenguaje natural , los programas informáticos analizan textos escritos en lenguas humanas. [ 4 ] Las oraciones humanas no son fáciles de analizar por los programas, ya que existe una ambigüedad sustancial en la estructura del lenguaje humano, cuyo uso es transmitir significado (o semántica ) entre una gama potencialmente ilimitada de posibilidades, pero solo algunas de las cuales son pertinentes al caso particular. [ 5 ] Así, una expresión "Hombre muerde perro" frente a "Perro muerde hombre" es precisa en un detalle, pero en otro idioma podría aparecer como "Hombre perro muerde", dependiendo del contexto más amplio para distinguir entre esas dos posibilidades, si es que esa diferencia fuera relevante. Es difícil preparar reglas formales para describir el comportamiento informal, aunque es evidente que se siguen algunas reglas.
Para analizar datos en lenguaje natural, los investigadores deben primero ponerse de acuerdo sobre la gramática que se utilizará. La elección de la sintaxis se ve afectada tanto por consideraciones lingüísticas como computacionales; por ejemplo, algunos sistemas de análisis sintáctico utilizan la gramática funcional léxica , pero en general, se sabe que el análisis sintáctico para gramáticas de este tipo es NP-completo . La gramática de estructura de frases dirigida por el núcleo es otro formalismo lingüístico que ha sido popular en la comunidad de análisis sintáctico, pero otros esfuerzos de investigación se han centrado en formalismos menos complejos, como el utilizado en Penn Treebank . El análisis sintáctico superficial tiene como objetivo encontrar solo los límites de los constituyentes principales, como los sintagmas nominales. Otra estrategia popular para evitar controversias lingüísticas es el análisis sintáctico de gramática de dependencia .
La mayoría de los analizadores sintácticos modernos son al menos parcialmente estadísticos; es decir, se basan en un corpus de datos de entrenamiento que ya ha sido anotado (analizado manualmente). Este enfoque permite al sistema recopilar información sobre la frecuencia con la que aparecen diversas construcciones en contextos específicos. (Véase aprendizaje automático ). Los enfoques que se han utilizado incluyen gramáticas libres de contexto probabilísticas ( PCFG ) directas, [ 6 ] entropía máxima , [ 7 ] y redes neuronales . [ 8 ] La mayoría de los sistemas más exitosos utilizan estadísticas léxicas (es decir, consideran las identidades de las palabras involucradas, así como su categoría gramatical ). Sin embargo, estos sistemas son vulnerables al sobreajuste y requieren algún tipo de suavizado para ser efectivos.
Los algoritmos de análisis sintáctico para el lenguaje natural no pueden depender de que la gramática tenga propiedades "agradables", como ocurre con las gramáticas diseñadas manualmente para lenguajes de programación. Como se mencionó anteriormente, algunos formalismos gramaticales son muy difíciles de analizar computacionalmente; en general, incluso si la estructura deseada no es libre de contexto , se utiliza algún tipo de aproximación libre de contexto a la gramática para realizar una primera pasada. Los algoritmos que utilizan gramáticas libres de contexto a menudo se basan en alguna variante del algoritmo CYK , generalmente con alguna heurística para descartar análisis improbables y ahorrar tiempo. (Véase análisis de gráficos ). Sin embargo, algunos sistemas sacrifican velocidad por precisión utilizando, por ejemplo, versiones de tiempo lineal del algoritmo shift-reduce . Un desarrollo relativamente reciente ha sido la reclasificación de análisis sintáctico, en la que el analizador propone un gran número de análisis y un sistema más complejo selecciona la mejor opción. En las aplicaciones de comprensión del lenguaje natural , los analizadores semánticos convierten el texto en una representación de su significado. [ 9 ]
Psicolingüística
En psicolingüística , el análisis sintáctico implica no solo la asignación de palabras a categorías (formación de inferencias ontológicas), sino también la evaluación del significado de una oración según las reglas sintácticas derivadas de las inferencias realizadas a partir de cada palabra de la oración (conocida como connotación ). Esto suele ocurrir mientras se escuchan o leen las palabras.
La neurolingüística generalmente entiende el análisis sintáctico como una función de la memoria de trabajo, lo que significa que se utiliza para mantener varias partes de una oración activas en la mente simultáneamente, todas fácilmente accesibles para ser analizadas según sea necesario. Debido a que la memoria de trabajo humana tiene limitaciones, también las tiene la función del análisis sintáctico de oraciones. [ 10 ] Esto se evidencia en varios tipos diferentes de oraciones sintácticamente complejas que demuestran posibles problemas para el análisis sintáctico mental de oraciones.
El primer tipo de oración, y quizás el más conocido, que dificulta la capacidad de análisis sintáctico es la oración ambigua. Estas oraciones están diseñadas de tal manera que la interpretación más común parece gramaticalmente incorrecta, pero tras un análisis más profundo, resultan ser gramaticalmente correctas. Las oraciones ambiguas son difíciles de analizar sintácticamente porque contienen una frase o una palabra con más de un significado, siendo a menudo su significado más típico una categoría gramatical diferente. [ 11 ] Por ejemplo, en la oración "el caballo corrió más allá del granero caído", "corrió" se interpreta inicialmente como un verbo en pasado, pero en esta oración funciona como parte de una frase adjetiva. [ 12 ] Dado que el análisis sintáctico se utiliza para identificar las categorías gramaticales, estas oraciones ponen a prueba la capacidad de análisis sintáctico del lector.
Otro tipo de oración que es difícil de analizar es una ambigüedad de adjunción, que incluye una frase que potencialmente podría modificar diferentes partes de una oración y, por lo tanto, presenta un desafío para identificar la relación sintáctica (por ejemplo, "El niño vio a la señora con el telescopio", en la que la frase ambigua "con el telescopio" podría modificar "el niño vio" o "la señora"). [ 11 ]
Un tercer tipo de oración que dificulta la capacidad de análisis sintáctico es la incrustación central, en la que las frases se colocan en el centro de otras frases de formación similar (por ejemplo, "La rata, el gato, el hombre golpeado, persiguió, corrió hacia la trampa"). Las oraciones con dos o, en los casos más extremos, tres incrustaciones centrales son difíciles de analizar mentalmente, nuevamente debido a la ambigüedad de la relación sintáctica. [ 13 ]
Dentro de la neurolingüística existen múltiples teorías que buscan describir cómo se lleva a cabo el análisis sintáctico en el cerebro. Un modelo es el modelo generativo más tradicional del procesamiento de oraciones, que postula que en el cerebro existe un módulo específico para el análisis sintáctico, precedido por el acceso al reconocimiento y recuperación léxica, y seguido por el procesamiento sintáctico que considera un único resultado sintáctico del análisis, revisando dicha interpretación solo si se detecta un problema potencial. [ 14 ] El modelo opuesto, más contemporáneo, postula que en la mente, el procesamiento de una oración no es modular ni sigue una secuencia estricta. Más bien, plantea que se pueden considerar varias posibilidades sintácticas diferentes simultáneamente, ya que el acceso léxico, el procesamiento sintáctico y la determinación del significado ocurren en paralelo en el cerebro. De esta manera, estos procesos se integran. [ 15 ]
Aunque aún queda mucho por aprender sobre la neurología del análisis sintáctico, algunos estudios han demostrado que varias áreas del cerebro podrían desempeñar un papel en este proceso. Estas incluyen el polo temporal anterior izquierdo, la circunvolución frontal inferior izquierda, la circunvolución temporal superior izquierda, la circunvolución frontal superior izquierda, la corteza cingulada posterior derecha y la circunvolución angular izquierda. Si bien no se ha demostrado de forma concluyente, se ha sugerido que estas diferentes estructuras podrían favorecer el análisis sintáctico basado en frases o en dependencias, lo que significa que los distintos tipos de análisis podrían procesarse de maneras diferentes que aún no se comprenden. [ 16 ]
Análisis del discurso
El análisis del discurso examina las formas de analizar el uso del lenguaje y los eventos semióticos. El lenguaje persuasivo puede denominarse retórica .
lenguajes informáticos
Analizador sintáctico
Un analizador sintáctico es un componente de software que toma datos de entrada (normalmente texto) y construye una estructura de datos , a menudo algún tipo de árbol de análisis , árbol de sintaxis abstracta u otra estructura jerárquica, que proporciona una representación estructural de la entrada mientras verifica la sintaxis correcta. El análisis sintáctico puede ir precedido o seguido de otros pasos, o estos pueden combinarse en un solo paso. El analizador sintáctico suele ir precedido de un analizador léxico independiente , que crea tokens a partir de la secuencia de caracteres de entrada; alternativamente, estos pueden combinarse en el análisis sintáctico sin escáner . Los analizadores sintácticos pueden programarse manualmente o pueden generarse de forma automática o semiautomática mediante un generador de analizadores sintácticos . El análisis sintáctico es complementario a la creación de plantillas , que produce una salida formateada . Estos pueden aplicarse a diferentes dominios, pero a menudo aparecen juntos, como el par scanf / printf , o las etapas de entrada (análisis sintáctico frontal) y salida (generación de código posterior) de un compilador .
La entrada a un analizador sintáctico suele ser texto en algún lenguaje informático , pero también puede ser texto en un lenguaje natural o datos textuales menos estructurados, en cuyo caso generalmente solo se extraen ciertas partes del texto, en lugar de construir un árbol de análisis. Los analizadores sintácticos abarcan desde funciones muy simples como scanf , hasta programas complejos como el frontend de un compilador de C++ o el analizador HTML de un navegador web . Una clase importante de análisis sintáctico simple se realiza mediante expresiones regulares , en las que un grupo de expresiones regulares define un lenguaje regular y un motor de expresiones regulares genera automáticamente un analizador sintáctico para ese lenguaje, lo que permite la coincidencia de patrones y la extracción de texto. En otros contextos, las expresiones regulares se utilizan antes del análisis sintáctico, como paso de análisis léxico, cuya salida es utilizada posteriormente por el analizador sintáctico.
El uso de analizadores sintácticos varía según el tipo de entrada. En el caso de los lenguajes de datos, un analizador sintáctico suele ser la función de lectura de archivos de un programa, como la lectura de texto HTML o XML ; estos ejemplos son lenguajes de marcado . En el caso de los lenguajes de programación , un analizador sintáctico es un componente de un compilador o intérprete , que analiza el código fuente de un lenguaje de programación para crear una representación interna; el analizador sintáctico es un paso clave en la etapa de compilación . Los lenguajes de programación suelen especificarse mediante una gramática determinista libre de contexto, ya que se pueden escribir analizadores sintácticos rápidos y eficientes para ellos. Para los compiladores, el análisis sintáctico puede realizarse en una o varias pasadas; véanse los compiladores de una pasada y de varias pasadas .
Las desventajas inherentes a un compilador de una sola pasada pueden superarse en gran medida mediante la adición de correcciones , donde se prevé la reubicación del código durante la pasada hacia adelante y las correcciones se aplican hacia atrás una vez que se reconoce que el segmento de programa actual se ha completado. Un ejemplo donde este mecanismo de corrección sería útil sería una instrucción GOTO hacia adelante, donde el destino de la instrucción GOTO se desconoce hasta que se completa el segmento de programa. En este caso, la aplicación de la corrección se retrasaría hasta que se reconociera el destino de la instrucción GOTO. Por el contrario, una instrucción GOTO hacia atrás no requiere una corrección, ya que la ubicación ya se conoce.
Las gramáticas libres de contexto tienen limitaciones para expresar todos los requisitos de un lenguaje. En términos sencillos, esto se debe a la memoria limitada de dicho lenguaje. La gramática no puede recordar la presencia de una construcción en una entrada arbitrariamente larga; esto es necesario para un lenguaje en el que, por ejemplo, un nombre debe declararse antes de poder referenciarse. Sin embargo, las gramáticas más potentes que pueden expresar esta restricción no pueden analizarse de forma eficiente. Por lo tanto, es una estrategia común crear un analizador sintáctico flexible para una gramática libre de contexto que acepte un superconjunto de las construcciones del lenguaje deseado (es decir, que acepte algunas construcciones inválidas); posteriormente, las construcciones no deseadas pueden filtrarse en la etapa de análisis semántico (análisis contextual).
Por ejemplo, en Python el siguiente código es sintácticamente válido:
x : int = 1 print ( x )Sin embargo, el siguiente código es sintácticamente válido en términos de la gramática libre de contexto, ya que produce un árbol sintáctico con la misma estructura que el anterior, pero viola la regla semántica que requiere que las variables se inicialicen antes de su uso:
x : int = 1 imprimir ( y )Descripción general del proceso

El siguiente ejemplo ilustra el caso común de análisis sintáctico de un lenguaje informático con dos niveles de gramática: léxico y sintáctico.
La primera etapa es la generación de tokens, o análisis léxico , mediante la cual la secuencia de caracteres de entrada se divide en símbolos significativos definidos por una gramática de expresiones regulares . Por ejemplo, un programa de calculadora examinaría una entrada como " 12 * (3 + 4)^2" y la dividiría en los tokens 12, *, (, 3, +, 4, ), ^, 2, cada uno de los cuales es un símbolo significativo en el contexto de una expresión aritmética. El analizador léxico contendría reglas para indicarle que los caracteres *, +, ^, (y )marcan el inicio de un nuevo token, por lo que no se generarán tokens sin sentido como " 12*" o " ".(3
La siguiente etapa es el análisis sintáctico, que consiste en comprobar que los tokens forman una expresión válida. Esto se suele hacer con referencia a una gramática libre de contexto que define recursivamente los componentes que pueden formar una expresión y el orden en que deben aparecer. Sin embargo, no todas las reglas que definen los lenguajes de programación pueden expresarse únicamente con gramáticas libres de contexto; por ejemplo, la validez de tipos y la declaración correcta de identificadores. Estas reglas pueden expresarse formalmente con gramáticas de atributos .
La fase final es el análisis semántico , que consiste en determinar las implicaciones de la expresión recién validada y tomar la acción apropiada. [ 17 ] En el caso de una calculadora o intérprete, la acción es evaluar la expresión o el programa; un compilador, por otro lado, generaría algún tipo de código. También se pueden usar gramáticas de atributos para definir estas acciones.
Tipos de analizadores sintácticos
La tarea del analizador sintáctico consiste esencialmente en determinar si la entrada se puede derivar del símbolo inicial de la gramática y cómo hacerlo. Esto se puede hacer básicamente de dos maneras:
- Análisis de arriba hacia abajo
- El análisis sintáctico descendente puede considerarse un intento de encontrar las derivaciones más a la izquierda de una secuencia de entrada mediante la búsqueda de árboles sintácticos utilizando una expansión descendente de las reglas gramaticales formales dadas . Los tokens se consumen de izquierda a derecha. La elección inclusiva se utiliza para acomodar la ambigüedad expandiendo todos los lados derechos alternativos de las reglas gramaticales. [ 18 ] Esto se conoce como el enfoque de la sopa primordial. Muy similar al diagramación de oraciones, la sopa primordial descompone los constituyentes de las oraciones. [ 19 ]
- Análisis de abajo hacia arriba
- Un analizador sintáctico puede comenzar con la entrada e intentar reescribirla hasta el símbolo inicial. Intuitivamente, el analizador intenta localizar los elementos más básicos, luego los elementos que los contienen, y así sucesivamente. Los analizadores LR son ejemplos de analizadores ascendentes. Otro término utilizado para este tipo de analizador es análisis de desplazamiento-reducción .
Los analizadores LL y el analizador recursivo-descendente son ejemplos de analizadores descendentes que no pueden acomodar reglas de producción recursivas izquierdas . Aunque se ha creído que las implementaciones simples de análisis descendente no pueden acomodar la recursión izquierda directa e indirecta y pueden requerir una complejidad de tiempo y espacio exponencial al analizar gramáticas libres de contexto ambiguas , Frost, Hafiz y Callaghan [ 20 ] [ 21 ] han creado algoritmos más sofisticados para el análisis descendente que acomodan la ambigüedad y la recursión izquierda en tiempo polinomial y que generan representaciones de tamaño polinomial del número potencialmente exponencial de árboles de análisis. Su algoritmo es capaz de producir derivaciones tanto más a la izquierda como más a la derecha de una entrada con respecto a una gramática libre de contexto dada .
Una distinción importante con respecto a los analizadores sintácticos es si un analizador genera una derivación por la izquierda o una derivación por la derecha (véase gramática libre de contexto ). Los analizadores LL generarán una derivación por la izquierda y los analizadores LR generarán una derivación por la derecha (aunque generalmente en orden inverso). [ 18 ]
AlgunoSe han diseñado algoritmos de análisis gráfico para lenguajes de programación visual. [ 22 ] [ 23 ] Los analizadores para lenguajes visuales a veces se basan engramáticas de grafos. [ 24 ]
Se han utilizado algoritmos de análisis sintáctico adaptativo para construir interfaces de usuario de lenguaje natural "autoextendibles" . [ 25 ]
Implementación
Enfoques alternativos para la implementación del analizador sintáctico:
- Los analizadores push llaman a los manejadores registrados ( callbacks ) tan pronto como el analizador detecta tokens relevantes en el flujo de entrada. Un analizador push puede omitir partes de la entrada que son irrelevantes (un ejemplo es Expat ).
- analizadores de extracción , como los que suelen usar los front-ends de los compiladores al "extraer" el texto de entrada.
- analizadores incrementales (como los analizadores de gráficos incrementales ) que, a medida que el usuario edita el texto del archivo, no necesitan volver a analizar completamente todo el archivo.
- Analizadores activos versus pasivos [ 26 ] [ 27 ]
Software de desarrollo de analizadores sintácticos
Algunas de las herramientas de desarrollo de analizadores sintácticos más conocidas incluyen las siguientes:
Mirar hacia adelante

intv;main(){vLa función Lookahead establece el número máximo de tokens entrantes que un analizador puede usar para decidir qué regla debe aplicar. Lookahead es especialmente relevante para los analizadores LL , LR y LALR , donde a menudo se indica explícitamente añadiendo Lookahead entre paréntesis al nombre del algoritmo, como por ejemplo LALR(1).
La mayoría de los lenguajes de programación , el objetivo principal de los analizadores sintácticos, están definidos cuidadosamente de tal manera que un analizador con anticipación limitada, normalmente uno, puede analizarlos, ya que los analizadores con anticipación limitada suelen ser más eficientes. Un cambio importante en esta tendencia se produjo en 1990 cuando Terence Parr creó ANTLR para su tesis doctoral, un generador de analizadores sintácticos para analizadores LL( k ) eficientes, donde k es cualquier valor fijo.
Los analizadores LR suelen tener pocas acciones después de ver cada token. Estas son: desplazamiento (añadir este token a la pila para su posterior reducción), reducción (extraer tokens de la pila y formar una construcción sintáctica), fin, error (no se aplica ninguna regla conocida) o conflicto (no sabe si desplazar o reducir).
La anticipación tiene dos ventajas.
- Ayuda al analizador sintáctico a tomar la medida correcta en caso de conflictos. Por ejemplo, analizar la instrucción if en el caso de una cláusula else.
- Elimina muchos estados duplicados y reduce la carga de una pila adicional. Un analizador sintáctico sin anticipación para lenguajes AC tendrá alrededor de 10 000 estados. Un analizador sintáctico con anticipación tendrá alrededor de 300 estados.
Ejemplo: Analizando la expresión 1 + 2 * 3
La mayoría de los lenguajes de programación (excepto algunos como APL y Smalltalk) y las fórmulas algebraicas dan mayor prioridad a la multiplicación que a la suma, en cuyo caso la interpretación correcta del ejemplo anterior es 1 + (2 * 3) . Cabe destacar que la Regla 4 anterior es una regla semántica. Es posible reescribir la gramática para incorporarla a la sintaxis. Sin embargo, no todas estas reglas pueden traducirse a sintaxis.
- Acciones de analizador sintáctico simples sin anticipación
Entrada inicial = [1, +, 2, *, 3]
- Desplaza "1" a la pila desde la entrada (anticipándose a la regla 3). Entrada = [+, 2, *, 3] Pila = [1]
- Reduce "1" a la expresión "E" según la regla 3. Pila = [E]
- Desplaza "+" a la pila desde la entrada (anticipándose a la regla 1). Entrada = [2, *, 3] Pila = [E, +]
- Desplazar "2" a la pila desde la entrada (anticipándose a la regla 3). Entrada = [*, 3] Pila = [E, +, 2]
- Reduzca el elemento de pila "2" a la expresión "E" según la regla 3. Pila = [E, +, E]
- Reduzca los elementos de la pila [E, +, E] y la nueva entrada "E" a "E" según la regla 1. Pila = [E]
- Desplazar "*" a la pila desde la entrada (anticipándose a la regla 2). Entrada = [3] Pila = [E,*]
- Desplaza "3" a la pila desde la entrada (anticipándose a la regla 3). Entrada = [] (vacía) Pila = [E, *, 3]
- Reducir el elemento de pila "3" a la expresión "E" según la regla 3. Pila = [E, *, E]
- Reduzca los elementos de la pila [E, *, E] y la nueva entrada "E" a "E" según la regla 2. Pila = [E]
El árbol de análisis sintáctico y el código resultante no son correctos según la semántica del lenguaje.
Para analizar correctamente sin anticipación, existen tres soluciones:
- El usuario debe encerrar las expresiones entre paréntesis. Esto a menudo no es una solución viable.
- El analizador sintáctico necesita incorporar más lógica para retroceder y reintentar cuando se infrinja una regla o esta quede incompleta. En los analizadores sintácticos de LL se sigue un método similar.
- Alternativamente, el analizador sintáctico o la gramática necesitan lógica adicional para retrasar la reducción y reducirla solo cuando estén completamente seguros de qué regla reducir primero. Este método se utiliza en los analizadores LR. Esto analiza correctamente la expresión, pero con muchos más estados y una mayor profundidad de pila.
- Acciones del analizador de anticipación
- Desplaza 1 a la pila en la entrada 1 anticipándose a la regla 3. No se reduce inmediatamente.
- Reduzca el elemento de la pila 1 a una expresión simple en la entrada + según la regla 3. La búsqueda anticipada es +, por lo que estamos en el camino a E +, por lo que podemos reducir la pila a E.
- Desplazar + a la pila en la entrada + en anticipación a la regla1.
- Desplazar 2 a la pila en la entrada 2 en anticipación a la regla 3.
- Reduzca el elemento de la pila 2 a la expresión en la entrada * según la regla 3. La búsqueda anticipada * espera solo E antes de ella.
- Ahora la pila tiene E + E y la entrada sigue siendo *. Ahora tiene dos opciones: desplazar según la regla 2 o reducir según la regla 1. Dado que * tiene mayor precedencia que + según la regla 4, desplazamos * a la pila anticipándonos a la regla 2.
- Desplazar 3 a la pila en la entrada 3 en anticipación a la regla 3.
- Reduzca el elemento de la pila 3 a Expresión después de ver el final de la entrada según la regla 3.
- Reduzca los elementos de la pila E * E a E según la regla 2.
- Reduzca los elementos de la pila E + E a E según la regla 1.
El árbol de análisis generado es correcto y simplemente más eficiente que los analizadores sin anticipación. Esta es la estrategia que siguen los analizadores LALR .
Lista de algoritmos de análisis sintáctico
- Algoritmo CYK : un algoritmo O(n³ ) para analizar gramáticas libres de contexto en forma normal de Chomsky.
- Analizador sintáctico de Earley : otro algoritmo O(n³ ) para analizar cualquier gramática libre de contexto.
- Analizador sintáctico GLR : un algoritmo para analizar cualquier gramática libre de contexto, creado por Masaru Tomita . Está optimizado para gramáticas deterministas, en las que realiza el análisis en tiempo casi lineal y en el peor de los casos en O(n³ ) .
- Algoritmo Inside-Outside : un algoritmo O(n³ ) para reestimar las probabilidades de producción en gramáticas probabilísticas libres de contexto.
- Análisis léxico
- Analizador LL : un algoritmo de análisis sintáctico relativamente simple de tiempo lineal para una clase limitada de gramáticas libres de contexto.
- Analizador LR : Un algoritmo de análisis sintáctico de tiempo lineal más complejo para una clase más amplia de gramáticas libres de contexto . Variantes:
- Analizador Packrat : un algoritmo de análisis sintáctico de tiempo lineal que admite algunas gramáticas libres de contexto y gramáticas de expresiones de análisis.
- Analizador Pratt
- Analizador sintáctico descendente recursivo : un analizador sintáctico descendente adecuado para gramáticas LL( k ).
- Algoritmo de maniobras : convierte una expresión matemática en notación infija a notación posfija.
Véase también
- Retroceder
- Analizador de gráficos
- Compilador-compilador
- Análisis sintáctico determinista
- Kit de herramientas para la reingeniería de software de DMS
- Corrector gramatical
- Analizador inverso
- Analizador LALR
- Analizador de la esquina izquierda
- Análisis léxico
- Gramática de expresiones de análisis sintáctico
- Analizador Pratt
- Transformación del programa
- Análisis superficial
- Análisis semántico
- Procesamiento de oraciones
- Análisis sintáctico (lingüística computacional)
- Generación de código fuente
Referencias
- 1 2 "Parse" . dictionary.reference.com . Consultado el 27 de noviembre de 2010 .
- ↑ Masaru Tomita (6 de diciembre de 2012). Análisis sintáctico generalizado de LR . Springer Science & Business Media. ISBN 978-1-4615-4034-2.
- ↑ "Gramática y composición" . Archivado del original el 1 de diciembre de 2016. Consultado el 24 de noviembre de 2012 .
- ^ Christopher D. Manning; Christopher D. Manning; Hinrich Schütze (1999). Fundamentos del procesamiento estadístico del lenguaje natural . Prensa del MIT. ISBN 978-0-262-13360-9.
- ↑ Jurafsky, Daniel (1996). "Un modelo probabilístico de acceso y desambiguación léxica y sintáctica". Cognitive Science . 20 (2): 137– 194. CiteSeerX 10.1.1.150.5711 . doi : 10.1207/s15516709cog2002_1 .
- ↑ Klein, Dan y Christopher D. Manning. « Análisis sintáctico preciso sin lexicalización ». Actas de la 41.ª Reunión Anual de la Asociación de Lingüística Computacional - Volumen 1. Asociación de Lingüística Computacional, 2003.
- ↑ Charniak, Eugene. " Un analizador sintáctico inspirado en la entropía máxima. Archivado el 1 de abril de 2019 en Wayback Machine ". Actas de la primera conferencia del capítulo norteamericano de la Asociación de Lingüística Computacional. Asociación de Lingüística Computacional, 2000.
- ↑ Chen, Danqi y Christopher Manning. « Un analizador de dependencias rápido y preciso que utiliza redes neuronales ». Actas de la conferencia de 2014 sobre métodos empíricos en el procesamiento del lenguaje natural (EMNLP). 2014.
- ↑ Jia, Robin; Liang, Percy (2016-06-11). "Recombinación de datos para el análisis semántico neuronal". arXiv : 1606.03622 [ cs.CL ].
- ↑ Sandra H. Vos, Thomas C. Gunter, Herbert Schriefers y Angela D. Friederici (2001) Análisis sintáctico y memoria de trabajo: Los efectos de la complejidad sintáctica, la amplitud de lectura y la carga concurrente, Language and Cognitive Processes, 16:1, 65-103, DOI: 10.1080/01690960042000085
- 1 2 Pritchett, BL (1988). Fenómenos de caminos de jardín y la base gramatical del procesamiento del lenguaje. Language, 64(3), 539–576. https://doi.org/10.2307/414532
- ↑ Thomas G Bever (1970). La base cognitiva de las estructuras lingüísticas . OCLC 43300456 .
- ↑ Karlsson, F. (2010). Restricciones de la memoria de trabajo en la incrustación de múltiples centros. Actas de la Reunión Anual de la Sociedad de Ciencias Cognitivas, 32. Recuperado de https://escholarship.org/uc/item/4j00v1j2
- ↑ Ferreira, F., & Clifton, C. (1986). La independencia del procesamiento sintáctico. Journal of Memory and Language, 25(3), 348–368. https://doi.org/10.1016/0749-596X(86)90006-9
- ↑ Atlas, JD (1997). Sobre la modularidad del procesamiento de oraciones: generalidad semántica y el lenguaje del pensamiento. Language and Conceptualization, 213–214.
- ↑ Lopopolo, Alessandro, van den Bosch, Antal, Petersson, Karl-Magnus y Roel M. Willems; Distinción de las operaciones sintácticas en el cerebro: dependencia y análisis de la estructura de la frase. Neurobiología del lenguaje 2021; 2 (1): 152–175. doi: https://doi.org/10.1162/nol_a_00029
- ↑ Berant, Jonathan y Percy Liang. « Análisis semántico mediante paráfrasis ». Actas de la 52.ª Reunión Anual de la Asociación de Lingüística Computacional (Volumen 1: Artículos extensos). 2014.
- 1 2 Aho, AV, Sethi, R. y Ullman, JD (1986) " Compiladores: principios, técnicas y herramientas." Addison-Wesley Longman Publishing Co., Inc. Boston, MA, EE. UU.
- ↑ Sikkel, Klaas (1997). Parsing schemata : a framework for specification and analysis of parsing algorithms . Berlín: Springer. ISBN 9783642605413OCLC 606012644
- ↑ Frost, R., Hafiz, R. y Callaghan, P. (2007) " Análisis sintáctico descendente modular y eficiente para gramáticas recursivas izquierdas ambiguas. Archivado el 22 de agosto de 2018 en Wayback Machine ". 10.º Taller Internacional sobre Tecnologías de Análisis Sintáctico (IWPT), ACL-SIGPARSE , páginas: 109-120, junio de 2007, Praga.
- ↑ Frost, R., Hafiz, R. y Callaghan, P. (2008) " Combinadores de analizadores sintácticos para gramáticas recursivas izquierdas ambiguas ". 10º Simposio Internacional sobre Aspectos Prácticos de los Lenguajes Declarativos (PADL), ACM-SIGPLAN , Volumen 4902/2008, Páginas: 167 - 181, enero de 2008, San Francisco.
- ↑ Rekers, Jan y Andy Schürr. " Definición y análisis de lenguajes visuales con gramáticas de grafos en capas ". Journal of Visual Languages & Computing 8.1 (1997): 27-55.
- ↑ Rekers, Jan y A. Schurr. « Un enfoque de gramática gráfica para el análisis sintáctico gráfico ». Visual Languages, Proceedings., 11th IEEE International Symposium on. IEEE, 1995.
- ↑ Zhang, Da-Qian, Kang Zhang y Jiannong Cao. " Un formalismo de gramática de grafos sensible al contexto para la especificación de lenguajes visuales ". The Computer Journal 44.3 (2001): 186-200.
- ↑ Jill Fain Lehman (6 de diciembre de 2012). Análisis sintáctico adaptativo: interfaces de lenguaje natural autoextensibles . Springer Science & Business Media. ISBN 978-1-4615-3622-2.
- ↑ Patrick Blackburn y Kristina Striegnitz. "Técnicas de procesamiento del lenguaje natural en Prolog" .
- ↑ Song-Chun Zhu. "Algoritmos clásicos de análisis sintáctico" .
- ↑ Tomado de Brian W. Kernighan y Dennis M. Ritchie (abril de 1988). El lenguaje de programación C. Prentice Hall Software Series (2.ª ed.). Englewood Cliffs/NJ: Prentice Hall. ISBN 0131103628.(Apéndice A.13 "Gramática", pág. 193 y siguientes)
Lecturas adicionales
- Chapman, Nigel P., LR Parsing: Theory and Practice , Cambridge University Press , 1987. ISBN 0-521-30413-X
- Grune, Dick; Jacobs, Ceriel JH, Técnicas de análisis sintáctico: una guía práctica , Vrije Universiteit Amsterdam , Ámsterdam, Países Bajos. Publicado originalmente por Ellis Horwood, Chichester, Inglaterra, 1990; ISBN 0-13-651431-6
Enlaces externos
- Generador de analizadores LALR Lemon
- Analizador sintáctico de Stanford El analizador sintáctico de Stanford
- Analizador sintáctico de la Universidad de Turín Analizador sintáctico de lenguaje natural para el italiano, de código abierto, desarrollado en Common Lisp por Leonardo Lesmo, de la Universidad de Turín, Italia.
- Breve historia de la construcción de analizadores sintácticos
- Análisis sintáctico
- Algoritmos sobre cadenas de caracteres
- Construcción de compiladores