Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal do Ceará Campus de Quixadá Linguagens de Programação: Sintaxe e Semântica* Flávio R. C. Sousa flaviosousa@ufc.br @flaviosousa www.es.ufc.br/~flavio * Material: George Darmiton da Cunha Cavalcanti Sintaxe e Semântica Provêm a definição da linguagem Sintaxe A forma ou estrutura das expressões, das instruções e das unidades de programas Estrutura formada de acordo com Regras Gramaticais da Linguagem. (Estruturas Sintáticas) Exemplo (condição diferente) Pascal ( <> ) ; C = ( != ) ; Ada ( /= ) Semântica O significado das expressões, das instruções e das unidades de programas Identificação das sequências de símbolos validos que constituem estruturas sintáticas Sintaxe e Semântica 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 Descrevendo a sintaxe: terminologia Uma linguagem é uma conjunto de sentenças Uma sentença é uma cadeia de tokens Um lexema é a unidade sintática de mais baixo nível de uma linguagem Exemplos: *, sum, begin, if Um token é uma categoria dos lexemas Sequência de caracteres sobre um alfabeto Exemplo: identificador, op_mult Descrevendo a sintaxe: terminologia Descrevendo a sintaxe: terminologia Exemplo (C) Resultado = 45 + Cont * 5; Lexema Token resultado identificador = sinal_igual 45 int_literal + op_soma Cont Identificador * op_mult 5 int_literal ; ponto_e_virgula Definição formal de linguagens Reconhecedores de linguagens Dispositivo que recebe um token como entrada e verifica se o mesmo pertence a linguagem Exemplo: Análise Sintática (parte de um compilador) Geradores de linguagens Dispositivo que gera sentenças da linguagem Determinando se a sintaxe de uma sentença em particular está correta Através de comparações com a estrutura da linguagem gerada If <condição = true> then <instrução> Métodos formais: descrever a sintaxe Forma de Backus-Naur (BNF) Método mais usado para descrever a sintaxe das linguagens de programação Uma metalinguagem é usada para descrever outras linguagens Extended Backus Naur Form (EBNF) Por apresentar algumas inconveniências a BNF foi estendida Aumenta Legibilidade e Capacidade escrita da BNF Gramáticas Livres de Contexto Gramáticas Livres de Contexto Desenvolvida por Noam Chomsky nos meados da década de 1950 Define uma classe de linguagens chamadas de linguagens livres de contexto Objetivo Descrever a sintaxe das linguagens naturais São gramáticas onde as regras de produção são definidas de forma mais livre Backus-Naur Form (BNF) Backus-Naur Form (1959) Inventada por John Backus para descrever o Algol 58 (International Algorithmic Language) 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 Terminais: lexemas e tokens Não-terminais: BNF abstrações Atual como variáveis Gramática Descreve linguagem através de coleção não vazia de regras de produção Uma regra de produção possui Lado esquerdo (LHS) lado direito (RHS) Regras BNF Uma regra possui um lado esquerdo (LHS) e um lado direito (RHS), e consiste de símbolos terminais e não-terminais LHS só pode ter UM símbolo terminal ou não- terminal RHS, em geral, tem combinações deles O símbolo | em RHS significa representação alternativa Regras BNF Listas Sintáticas Listas sintáticas são descritas usando recursão <ident_list> -> ident | ident , <ident_list> Derivação Aplicação de regras repetidas vezes, começando com um símbolo inicial finalizando com uma sentença (símbolos terminais) Gramática para uma linguagem <program> <stmts> <stmts> <stmt> | <stmt> ; <stmts> <stmt> <var> = <expr> <var> a | b | c | d <expr> <term> + <term> | <term> - <term> <term> <var> | const Exemplo gramática para uma linguagem <program> => <stmts> => <stmt> => <var> = <expr> => a = <expr> => a = <term> + <term> => a = <var> + <term> => a = b + <term> => a = b + const Árvore de Análise (Parse Tree) A = B * (A + C) Ambigüidade em gramáticas Uma gramática é ambígua se e somente se ela gera uma sentença que possui duas ou mais árvores de análise distintas Gramática ambígua A = B * A + C Gramática não-ambígua Se usarmos a árvore de análise sintática para indicar níveis de precedência dos operadores, não teremos a ambiguidade Associatividade de Operadores Exemplo <expr> -> <expr> + <expr> | const (ambígua) <expr> -> <expr> + const | const (não-ambígua) Árvore de análise assoc. da adição A = B + C + A BNF estendida Partes opcionais são delimitadas por colchetes [ ] <proc_call> -> ident [(<expr_list>)] Partes alternativas de RHSs são colocadas entre parênteses e separadas com barras verticais <term> → <term> (+|-) const Repetições (0 ou mais) são colocadas entre chaves { } <ident> → letter {letter|digit} BNF e EBNF BNF <expr> <expr> + <term> | <expr> - <term> | <term> <term> <term> * <factor> | <term> / <factor> | <factor> EBNF <expr> <term> {(+ | -) <term>} <term> <factor> {(* | /) <factor>}
Compartilhar