CCT-UFCA/Ciência da Computação/Fundamentos de Linguagens de Programação/Noções Básicas De Sintaxe, Semântica E Gramáticas.
Noções Básicas De Sintaxe, Semântica E Gramáticas.
[editar | editar código]Definição de Sintaxe e Semântica
[editar | editar código]Sintaxe
[editar | editar código]A sintaxe define a estrutura e as regras de escrita de uma linguagem de programação. Ela determina como os símbolos, palavras-chave e expressões podem ser combinados corretamente.
- Está relacionada à forma do código
- Define o que é considerado válido na linguagem
Exemplo:
int x = 10; // sintaticamente correto
int = x 10; // erro de sintaxe
Semântica
[editar | editar código]A semântica define o significado das construções sintáticas, ou seja, o que o código realmente faz quando executado.
- Está relacionada ao comportamento do programa
- Pode ser correta mesmo com diferentes formas sintáticas
Exemplo:
int x = 10 / 0; // sintaticamente correto, mas semanticamente inválido (erro em execução)
Contexto histórico das gramáticas de linguagens de programação
[editar | editar código]O estudo das gramáticas formais surgiu a partir da necessidade de descrever linguagens de programação de forma rigorosa e não ambígua.
- Na década de 1950, com o desenvolvimento de linguagens como FORTRANe ALGOL, surgiu a necessidade de padronizar suas definições.
- A linguagem ALGOL 60 foi um marco importante, pois foi a primeira a ter sua sintaxe formalmente definida por uma gramática.
- O linguista Noam Chomsky contribuiu com a teoria das gramáticas formais (Hierarquia de Chomsky), que influenciou diretamente a definição de linguagens de programação.
- A partir disso, surgiram notações formais como a BNF para descrever sintaxes de maneira precisa.
Esse avanço foi essencial para o desenvolvimento de compiladores e interpretadores.
Metalinguagem BNF (Backus-Naur Form)
[editar | editar código]A BNF (Backus-Naur Form) é uma metalinguagem utilizada para descrever a sintaxe de linguagens de programação de forma formal.
Ela define regras de produção compostas por:
- Símbolos não-terminais (representam estruturas)
- Símbolos terminais (tokens reais da linguagem)
Estrutura básica:
<expressão> ::= <termo> | <expressão> + <termo>
Exemplo:
<numero> ::= 0 | 1 | 2 | 3 | ... | 9
Vantagens:
- Precisão na definição da linguagem
- Facilita a construção de compiladores
Pode ser menos expressiva para representar repetições e opcionais.
Árvores de Análise Sintática
[editar | editar código]As árvores de análise sintática (parse trees) representam a estrutura hierárquica de um código de acordo com a gramática.
- Cada nó representa uma construção da linguagem
- As folhas representam os símbolos terminais
Exemplo:
Considere a seguinte linguagem onde os termos entre < > são as variáveis e os outros símbolos são terminais:
<exp> ::= <exp> + <val> | <val> <val> ::= <val> * <num> | <num> <num> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Exemplo:
3 + 4 * 5
A árvore mostra como a expressão é organizada conforme as regras da linguagem.
<exp>
/ | \
<exp> + <val>
| / | \
<val> <val> * <num>
| | |
<num> <num> 5
| |
3 4
Ambiguidade
[editar | editar código]Uma gramática é ambígua quando uma mesma expressão pode gerar mais de uma árvore sintática.
Exemplo:
3 + 4 * 5
Pode ser interpretado como:
- (3 + 4) * 5
- 3 + (4 * 5)
Precedência de Operadores
[editar | editar código]Define a ordem em que os operadores são avaliados.
- Multiplicação (*) tem precedência maior que adição (+)
Exemplo correto:
3 + 4 * 5 = 3 + (4 * 5)
Associatividade de Operadores
[editar | editar código]Define como operadores de mesma precedência são avaliados:
- Associatividade à esquerda:
a - b - c = (a - b) - c - Associatividade à direita:
a ^ b ^ c = a ^ (b ^ c)
Esses conceitos eliminam ambiguidades na interpretação.
Metalinguagem EBNF (Extended Backus-Naur Form)
[editar | editar código]A EBNF é uma extensão da BNF que adiciona mais recursos para tornar a descrição das linguagens mais simples e expressiva.
Principais extensões:
[editar | editar código]- Opcional:
[ elemento ] - Repetição:
{ elemento } - Agrupamento:
( elemento )
Exemplo:
<lista> ::= <numero> { "," <numero> }
(Significa uma lista de números separados por vírgula)
Vantagens da EBNF
[editar | editar código]- Mais compacta e legível que a BNF
- Facilita a representação de estruturas repetitivas
- Muito utilizada em documentação de linguagens modernas
Observação: EBNF é amplamente usada na definição de sintaxes em especificações formais atuais.