¿Cuál es la diferencia entre sintaxis y gramática?

14

Entiendo la diferencia entre sintaxis y semántica:

Sintaxis : cómo se combinan los símbolos para formar una expresión o declaración válida.
Semántica : el significado de esos símbolos que forman una expresión o enunciado.

¿Pero cuál es la gramática? Por ejemplo: a veces escucho a la gente decir que alguna construcción es "gramaticalmente incorrecta pero sintácticamente es correcta". Qué significa eso?

cpx
fuente
FWIW, esto me parece una tontería. Si la gramática del lenguaje acepta el fragmento de código, conforma la sintaxis. Quizás alguien tenga una definición muy amplia (y no estándar) de "sintaxis". Contexto / fuente?
@delnan. No es verdad. Por ejemplo, int;es gramaticalmente válido, pero sintácticamente mal formado en C ++. La gramática no tiene ningún problema con este código, pero las restricciones de sintaxis requieren que se proporcione un nombre si la primera parte de una declaración no contiene especificador de clase o especificador de enumeración o, en C ++ 11, especificador de amigo .
Johannes Schaub - litb
@ JohannesSchaub-litb: ¿Te importa citar la parte de la gramática que hace que esto sea válido?
@Johanes Eso es lo contrario de la situación en la pregunta.
Nicole
2
@ Johannes Schaub: ¿Qué regla hace que "int;" ¿válido? La gramática define la sintaxis.
Casey Patton

Respuestas:

6

Una gramática es un conjunto de reglas que definen la sintaxis para un idioma en particular.

Cuando las personas hablan específicamente de un analizador sintáctico (especialmente uno generado con un generador de analizador sintáctico como yacc, Byacc, ANTLR, etc.), pueden dividir un poco más el cabello y hablar específicamente sobre esas reglas sintácticas que se codifican utilizando el generador reglas, frente a aquellas partes que se aplican por separado mediante el código adjunto a una regla. Por ejemplo, en C cuando define una matriz, el tamaño que especifique para la matriz debe ser estrictamente positivo (no cero). La regla gramatical básicamente podría decir algo como:

typename var_name '[' unsigned_int ']'

... y luego por separado, habría un poco de código para verificar que unsigned_int no era cero. En este caso, podría tener sentido hablar sobre los requisitos de la sintaxis y la gramática por separado, y los dos tienen requisitos ligeramente diferentes (que, aplicados juntos, suponemos que se ajustan a los requisitos del lenguaje en sí).

Jerry Coffin
fuente
3

La diferencia es difusa y no vale la pena preocuparse demasiado.

Las personas a veces incluirán restricciones sensibles al contexto bajo el paraguas de la corrección sintáctica. El ejemplo más común es un sistema de tipos. Otra es la regla de Java "sin declaraciones después del retorno". Esto simplifica la discusión formal: la sintaxis produce un lenguaje (un conjunto de oraciones / expresiones / programas) que es el dominio de la semántica; cualquier otra cosa "no es un programa", y la semántica no necesita molestarse con él.

En contraste, la "gramática" típicamente se refiere a un método para describir lenguajes libres de contexto (a pesar de las gramáticas de atributos).

La razón por la que no vale la pena preocuparse demasiado es que los sistemas de tipos se consideran con tanta frecuencia la " semántica estática " de un lenguaje como una " disciplina sintáctica para la corrección". Y a veces un idioma no tiene una gramática adecuada sin contexto; C, por ejemplo, debe alimentar la información del analizador nuevamente al lexer.

Pragmáticamente, cualquiera que confíe en una distinción entre "sintáctico" y "gramatical" debería decirlo y explicar lo que significan.

Ryan Culpepper
fuente
No entiendo por qué la diferencia es borrosa. La gramática describe la sintaxis.
Casey Patton
1
@Casey, no, de acuerdo con un uso de la palabra "sintaxis", la gramática especifica un superconjunto de la sintaxis.
Ryan Culpepper
0

Una gramática es un conjunto de reglas para definir un idioma. Más bien, la gramática describe la sintaxis y la semántica . Un idioma puede tener dos gramáticas diferentes:

  • Gramática de sintaxis (un conjunto de reglas que describe el orden de los símbolos en el idioma)
  • Gramática semántica (un conjunto de reglas que describen la ubicación semántica válida y el uso de esos símbolos)

Por ejemplo, una parte de la gramática en C podría verse así:

if statement -> if_keyword "(" expression ")" if_block
if_keyword -> "if"
logical_statement -> some other stuff here...

Sentido:

an if statement is made of an if keyword followed by a parenthesis followed by an expression followed by a parenthesis followed by an if block
an if keyword is ....

Eche un vistazo a esta forma de definir una gramática . Si realmente siente curiosidad por las gramáticas, eche un vistazo a GNU Bison , que es básicamente una herramienta para describir la gramática de un lenguaje.

El "gramaticalmente incorrecto pero sintácticamente correcto" no tiene demasiado sentido. Tal vez se refieren a una gramática que describe la semántica de un lenguaje. Sin embargo, tendría más sentido decir "no semánticamente correcto".

Casey Patton
fuente
77
No, la gramática no define la semántica y nunca debería hacerlo, a menos que sea algo exótico, como contextfreeart.org
SK-logic