En los lenguajes formales , los símbolos terminales y no terminales son los elementos léxicos utilizados para especificar las reglas de producción que constituyen una gramática formal . Los símbolos terminales son los símbolos elementales del lenguaje definidos como parte de una gramática formal. Los símbolos no terminales (o variables sintácticas ) se reemplazan por grupos de símbolos terminales de acuerdo con las reglas de producción.
Los terminales y no terminales de una gramática particular están en dos conjuntos completamente separados .
Los símbolos terminales son símbolos que pueden aparecer en los resultados de las reglas de producción de una gramática formal y que no se pueden modificar mediante las reglas de la gramática. La aplicación recursiva de las reglas a una cadena de origen de símbolos normalmente terminará en una cadena de salida final que consta únicamente de símbolos terminales.
Considere una gramática definida por dos reglas. En esta gramática, el símbolo Б
es un símbolo terminal y Ψ
es a la vez un símbolo no terminal y el símbolo inicial. Las reglas de producción para crear cadenas son las siguientes:
Ψ
puede convertirse enБ
Ψ
Ψ
puede convertirse enБ
Aquí Б
hay un símbolo terminal porque no existe ninguna regla que lo cambie por otra cosa. Por otro lado, Ψ
tiene dos reglas que pueden cambiarlo, por lo que no es terminal. Un lenguaje formal definido o generado por una gramática particular es el conjunto de cadenas que puede producir la gramática y que consisten únicamente en símbolos terminales . El diagrama 1 ilustra una cadena que se puede producir con esta gramática.
Los símbolos no terminales son aquellos símbolos que pueden reemplazarse. También pueden llamarse simplemente variables sintácticas . Una gramática formal incluye un símbolo de inicio , un miembro designado del conjunto de no terminales del que pueden derivarse todas las cadenas del lenguaje mediante aplicaciones sucesivas de las reglas de producción. De hecho, el lenguaje definido por una gramática es precisamente el conjunto de cadenas terminales que pueden derivarse de esa manera.
Las gramáticas libres de contexto son aquellas gramáticas en las que el lado izquierdo de cada regla de producción consiste en un solo símbolo no terminal. Esta restricción no es trivial; no todos los lenguajes pueden generarse mediante gramáticas libres de contexto. Aquellos que pueden hacerlo se denominan lenguajes libres de contexto. Estos son exactamente los lenguajes que pueden ser reconocidos por un autómata de inserción no determinista . Los lenguajes libres de contexto son la base teórica de la sintaxis de la mayoría de los lenguajes de programación .
Una gramática se define mediante reglas de producción (o simplemente 'producciones') que especifican qué símbolos pueden reemplazar a qué otros símbolos; estas reglas se pueden usar para generar cadenas o para analizarlas. Cada una de estas reglas tiene una cabecera , o lado izquierdo, que consiste en la cadena que se puede reemplazar, y un cuerpo , o lado derecho, que consiste en una cadena que puede reemplazarla. Las reglas se escriben a menudo en la forma cabecera → cuerpo ; por ejemplo, la regla a → b especifica que a se puede reemplazar por b .
En la formalización clásica de gramáticas generativas propuesta por primera vez por Noam Chomsky en la década de 1950, [2] [3] una gramática G consta de los siguientes componentes:
Una gramática se define formalmente como la cuádruple ordenada . A este tipo de gramática formal se la suele denominar en la literatura sistema de reescritura o gramática de estructura de frase . [4] [5]
La forma Backus-Naur es una notación para expresar ciertas gramáticas. Por ejemplo, las siguientes reglas de producción en la forma Backus-Naur se utilizan para representar un número entero (que puede tener signo):
< dígito > ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' < entero > ::= ['-'] < dígito > { < dígito > }
En este ejemplo, los símbolos ( -,0,1,2,3,4,5,6,7,8,9 ) son símbolos terminales y <digit>
y <integer>
son símbolos no terminales. [nota 2]
Otro ejemplo es:
En este ejemplo, los símbolos a, b, c, d son símbolos terminales y S, A son símbolos no terminales.