Ir para o conteúdo

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]

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.