Sintaxe e Semântica George Darmiton da Cunha Cavalcanti (gdcc@cin.ufpe.br)
Tópicos Introdução O problema de descrever a sintaxe Métodos formais para descrever a sintaxe Gramáticas de atributos Descrevendo o significado dos programas: semântica dinâmica
Introdução Sintaxe A forma ou estrutura das expressões, das instruções e das unidades de programas Semântica O significa das expressões, das instruções e das unidades de programas Exemplo: comando if na linguagem C Sintaxe if (<expr>) <instrução> Semântica Se o valor da expressão for verdadeiro, a instrução será executada
Introdução A sintaxe e a semântica provêm a definição da linguagem Usuários da definição da linguagem Projetistas de linguagens Programadores Descrever a sintaxe é mais fácil do que a semântica Uma notação concisa e universal para a sintaxe existe
Descrevendo a sintaxe: terminologia Uma sentença é uma cadeia de caracteres sobre um alfabeto Uma linguagem é uma conjunto de sentenças Um lexema é a unidade sintática de mais baixo nível de uma linguagem Exemplos: *, sum, begin Um token é uma categoria dos lexemas Exemplo: identificador, op_mult
Descrevendo a sintaxe: terminologia Em alguns casos, um token tem apenas um único lexema possível. Exemplo de instrução em C index = 2 * cont + 17; Lexema index = 2 * Cont + 17 ; Token Identificador sinal_igual int_literal op_mult identificador op_soma int_literal ponto_e_vírgula
Definição formal de linguagens Reconhecedores de linguagens Um dispositivo que recebe uma string como entrada e verifica se a mesma pertence a linguagem Exemplo: análise sintática (parte de um compilador) Geradores de linguagens Um dispositivo que gera sentenças de uma linguagem É possível determinar se a sintaxe de uma sentença em particular está correta através da comparação dela com a estrutura do gerador
Métodos formais para descrever a sintaxe Forma de Backus-Naur e Gramática Livre de Contexto Método mais usado para descrever a sintaxe das linguagens de programação Extended BNF (Backus-Naur Form) Aumenta readability e writability da BNF
BNF e Gramáticas Livres de Contexto Gramáticas Livres de Contexto Desenvolvida por Noam Chomsky nos meados da década de 1950 Objetivando descrever a sintaxe das linguagens naturais Define uma classe de linguagens chamadas de linguagens livres de contexto
Backus-Naur Form (BNF) Backus-Naur Form (1959) Inventada por John Backus para descrever o Algol 58 BNF é equivalente a gramáticas livre de contexto BNF é uma metalinguagem usada para descrever outras linguagens Em BNF, abstrações são usadas para representar classes de estruturas sintáticas Agem como variáveis sintáticas (também chamadas de símbolos não-terminais)
BNF Fundamentos Não-terminais: BNF abstrações Terminais: lexemas e tokens Gramática: uma coleção de regras Exemplos de regras BNF: <ident_list> identifier identifier, <ident_list> <if_stmt> if <logic_expr> then <stmt> Abstrações
Regras BNF Uma regra possui um lado esquerdo (LHS) e um lado direito (RHS), e consiste de símbolos terminais e não-terminais Uma gramática é um conjunto não vazio de regras Uma abstração (ou símbolo não-terminal) pode ter mais de um RHS <stmt> <single_stmt> begin <stmt_list> end
Descrevendo Listas Listas sintáticas são descritas usando recursão <ident_list> ident ident, <ident_list> Uma derivação é a aplicação de regras repetidas vezes, começando com um símbolo inicial e finalizando com uma sentença formada de símbolos terminais
Uma gramática para uma pequena linguagem
Uma gramática para instruções de atribuição simples
Árvore de Análise (Parse Tree)
Ambigüidade em gramáticas Uma gramática é ambígua se e somente se ela gera uma sentença para a qual há duas ou mais árvores de análise distintas
Uma gramática ambígua para instruções de atribuição simples
Duas árvores de análise para a mesma sentença
Uma gramática não-ambígua para expressões
A árvore de análise única para a expressão
Associatividade de operadores Associatividade de operadores podem ser indicados pela gramática <expr> -> <expr> + <expr> const (ambígua) <expr> -> <expr> + const const (não-ambígua) <expr> <expr> + const <expr> + const const
Uma árvore de análise ilustrando a associatividade da adição
BNF estendida Partes opcionais são colocadas entre colchetes [ ] <proc_call> -> ident [(<expr_list>)] Opções de múltipla escolha, partes alternativas da RHS são colocadas dentro de parênteses e separadas por barras verticais <term> <term>(+ -) const Repetições (0 ou mais) são colocadas dentro de chaves { } <ident> letter {letter digit}
BNF e EBNF
Gramáticas de Atributos Gramáticas livres de contexto (GLC) não podem descrever toda a sintaxe de linguagens de programação Compatibilidade de tipos Pois a gramática iria se tornar grande demais Exigindo símbolos não-terminais e regras adicionais Gramáticas de atributos incorporam informações semânticas nas parse trees
Gramáticas de Atributos Exemplos de regras que não podem ser especificadas na BNF Determina que todas as variáveis devem ser declaradas antes de serem referenciadas O end do subprograma Ada seguido de um nome deve coincidir com o nome do subprograma Esses dois problemas exemplificam a categoria das regras de linguagem chamada de semântica estática Leva esse nome pois a análise necessária para verificar essas especificações pode ser feita na compilação
Gramáticas de Atributos: Exemplo Em um procedimento em Ada, o nome no end deve ser igual ao nome do procedimento Regra de sintaxe <def_proc> procedure <nome_do_proc>[1] <corpo_do_proc> end <nome_do_proc>[2] Regra semântica <nome_do_proc>[1].string = <nome_do_proc>[2].string
Gramáticas de Atributos: Exemplo Verificação das regras de tipos de uma instrução de atribuição simples Parte sintática da gramática <assign> <var> = <expr> <expr> <var> + <var> <var> <var> A B C Observações: As variáveis podem ser de dois tipos: int ou real O tipo do lado esquerda expressão deve ser o mesmo do lado direito O tipo da expressão quando os tipos dos operandos são diferentes é real
Gramáticas de Atributos do exemplo anterior
Gramáticas de Atributos: uma árvore de análise
Gramáticas de Atributos: computando os valores de atributo 1. <var>.tipo_efetivo look-up(a) Regra 4 2. <expr>.tipo_esperado var.tipo_efetivo Regra 1 3. <var>[2].tipo_efetivo look-up (A) Regra 4 <var>[3].tipo_efetivo look-up (B) Regra 4 4. <expr>.tipo_efetivo int ou real Regra 2 5. <expr>.tipo_esperado = <expr>.tipo_efetivo é TRUE ou FALSE Regra 2
Gramáticas de Atributos: computando os valores de atributo Valores finais nos vértices, adotando A como real e B como int
Gramáticas de Atributos: avaliação Têm sido utilizadas em diversas aplicações Descrições completas da sintaxe e da semântica de linguagens de programação Como a definição formal de uma linguagem (geração de compiladores) Sistemas de processamento de linguagens naturais Dificuldades Complexo e grande Dificuldade de leitura e escritas das gramáticas