Qual é a diferença entre sintaxe e gramática?


14

Eu entendo a diferença entre sintaxe e semântica -

Sintaxe : como os símbolos são combinados para formar uma expressão ou declaração válida.
Semântica : o significado desses símbolos que formam uma expressão ou afirmação.

Mas qual é a gramática? Por exemplo: às vezes ouço as pessoas dizerem que alguma construção é "gramaticalmente incorreta, mas sintaticamente está correta". O que isso significa?


FWIW, isso parece bobagem para mim. Se a gramática do idioma aceitar o trecho de código, ela estará em conformidade com a sintaxe. Talvez alguém tenha uma definição muito ampla (e não padrão) de "sintaxe". Contexto / fonte?

@delnan. Não é verdade. Por exemplo, int;é gramaticalmente válido, mas sintaticamente mal formado em C ++. A gramática não tem problemas com esse código, mas as restrições de sintaxe exigem que um nome seja fornecido se a primeira parte de uma declaração não contiver especificador de classe ou enum-especificador ou, no C ++ 11, especificador de amigo .
Johannes Schaub - litb 30/10

@ JohannesSchaub-litb: Gostaria de citar a parte da gramática que torna isso válido?

@ Johanes Esse é o inverso da situação na questão.
30511 Nicole

2
@ Johannes Schaub: Que regra cria "int;" válido? A gramática define a sintaxe.
Casey Patton

Respostas:


6

Uma gramática é um conjunto de regras que definem a sintaxe para um idioma específico.

Quando as pessoas estão falando especificamente sobre um analisador (especialmente um gerado com um gerador de analisador como yacc, Byacc, ANTLR etc.), podem fazer um pouco mais de cortar o cabelo e falar especificamente sobre as regras sintáticas que são codificadas usando o gerador do analisador. regras, vs. as partes que são aplicadas separadamente pelo código anexado a uma regra. Por exemplo, em C quando você define uma matriz, o tamanho especificado para a matriz deve ser estritamente positivo (não zero). A regra gramatical pode dizer basicamente algo como:

typename var_name '[' unsigned_int ']'

... e, separadamente, haveria um pouco de código para verificar se o unsigned_int era diferente de zero. Nesse caso, poderia fazer algum sentido falar sobre os requisitos da sintaxe e da gramática separadamente um do outro, com os dois tendo requisitos um pouco diferentes (que, aplicados juntos, presumimos atender aos requisitos do próprio idioma).


3

A diferença é imprecisa e não vale a pena se preocupar demais.

Às vezes, as pessoas incluem restrições sensíveis ao contexto sob a égide da correção sintática. O exemplo mais comum é um sistema de tipos. Outra é a regra "sem instruções após o retorno" de Java. Isso simplifica a discussão formal: a sintaxe produz uma linguagem (um conjunto de frases / expressões / programas) que é o domínio da semântica; qualquer outra coisa "não é um programa", e a semântica não precisa se preocupar com isso.

Por outro lado, "gramática" geralmente se refere a um método para descrever linguagens livres de contexto (não obstante as gramáticas de atributos).

A razão pela qual não vale a pena se preocupar é que os sistemas de tipos são frequentemente considerados a " semântica estática " de uma linguagem, assim como uma " disciplina sintática da correção". E, às vezes, uma linguagem não possui uma gramática livre de contexto; C, por exemplo, deve alimentar as informações do analisador novamente no lexer.

Pragmaticamente, qualquer pessoa que confie na distinção entre "sintático" e "gramatical" deve dizer isso e explicar o que quer dizer.


Não entendo por que a diferença é nebulosa. A gramática descreve a sintaxe.
Casey Patton

1
@ Casey, não, de acordo com um uso da palavra "sintaxe", a gramática especifica um superconjunto da sintaxe.
quer

0

Uma gramática é um conjunto de regras para definir um idioma. Em vez disso, a gramática descreve a sintaxe e a semântica . Um idioma pode ter duas gramáticas diferentes:

  • Gramática de sintaxe (um conjunto de regras que descreve a ordem dos símbolos no idioma)
  • Gramática semântica (um conjunto de regras que descrevem o posicionamento semântico válido e o uso desses símbolos)

Por exemplo, uma parte da gramática em C pode ser algo como:

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

Significado:

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 ....

Dê uma olhada nesta maneira de definir uma gramática . Se você está realmente curioso sobre gramáticas, dê uma olhada no GNU Bison , que é basicamente uma ferramenta para descrever a gramática de um idioma.

O "gramaticalmente incorreto, mas sintaticamente correto" não faz muito sentido. Talvez eles estejam se referindo a uma gramática que descreve a semântica de uma linguagem. Certamente faria mais sentido dizer apenas "não semanticamente correto".


7
Não, a gramática não define semântica e nunca deve fazê-lo, a menos que seja algo exótico, como contextfreeart.org
SK-lógica
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.