Sintaxe e Semântica Prof.: Gláucya Carreiro Boechat Universidade Federal Rural de Pernambuco Departamento de Estatística e Informática Sintaxe e Semântica Prof.: Gláucya Carreiro Boechat glaucyacboechat@gmail.com
Paradigmas de Programação - prof Gláucya Carreiro Boechat 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 seqüências de símbolos validos que constituem estruturas sintáticas Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat 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 Paradigmas de Programação - prof Gláucya Carreiro Boechat
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 Seqüência de caracteres sobre um alfabeto Exemplo: identificador, op_mult Paradigmas de Programação - prof Gláucya Carreiro Boechat
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 ; ponto_e_virgula Paradigmas de Programação - prof Gláucya Carreiro Boechat
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> Paradigmas de Programação - prof Gláucya Carreiro Boechat
Métodos formais para 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 Paradigmas de Programação - prof Gláucya Carreiro Boechat
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 Paradigmas de Programação - prof Gláucya Carreiro Boechat
Backus-Naur Form (BNF) 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) Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat BNF - Fundamentos Terminais: lexemas e tokens Não-terminais: BNF abstrações Atual como variáveis Gramática: uma coleção de regras Exemplos de regras BNF: Atribuição em C(Representada pela abstração) <Atribuição> --> <var> = <expressão> <ident_list> -> identifier | identifier , <ident_list> <if_stmt> -> if <expr_logica> then <stmt> <if_stmt> -> if <expr_logica> then <stmt> else <stmt> Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat Regras BNF Uma regra possui um lado esquerdo (LHS - Left Hand Side) consiste de símbolos não-terminais um lado direito (RHS - Right Hand Side), 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 Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat 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) Paradigmas de Programação - prof Gláucya Carreiro Boechat
Uma gramática para uma pequena linguagem <program> -> begin <stmts> end <stmts> -> <stmt> | <stmt> ; <stmts> <stmt> -> <var> = <expr> <var> -> a | b | c | d <expr> -> <term> + <term> | <term> - <term> <term> -> <var> | const Paradigmas de Programação - prof Gláucya Carreiro Boechat
Exemplo gramática para uma pequena linguagem <program> <stmts> <stmt> <var> = <expr> a <term> + <term> <var> const b <program> => <stmts> => <stmt> => <var> = <expr> => a = <expr> => a = <term> + <term> => a = <var> + <term> => a = b + <term> => a = b + const Paradigmas de Programação - prof Gláucya Carreiro Boechat
Uma gramática para instruções de atribuição simples <assign> -> <id> = <expr> <id> -> A | B | C <expr> -> <id> + <expr> | <id> * <expr> | ( <expr> ) | <id> Paradigmas de Programação - prof Gláucya Carreiro Boechat
Árvore de Análise (Parse Tree) Paradigmas de Programação - prof Gláucya Carreiro Boechat
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 Paradigmas de Programação - prof Gláucya Carreiro Boechat
Uma gramática ambígua para instruções de atribuição simples <assign> -> <id> = <expr> <expr> -> <expr> + <expr> | <expr> * <expr> | ( <expr> ) | <id> <id> -> A | B | C Paradigmas de Programação - prof Gláucya Carreiro Boechat
Duas árvores de análise para a mesma sentença A = B + C * A Paradigmas de Programação - prof Gláucya Carreiro Boechat
Uma gramática não-ambígua para expressões indicar os níveis de precedência de operadores, não teremos ambigüidade <assign> -> <id> = <expr> <expr> -> <expr> + <term> | <term> <term> -> < term > * <factor> | <factor> <factor> -> ( <expr> ) | <id> <id> -> A | B | C Paradigmas de Programação - prof Gláucya Carreiro Boechat
A árvore de análise única para a expressão A = B + C * A Paradigmas de Programação - prof Gláucya Carreiro Boechat
Exemplo – Sintaxe para expressões Calculadora simples Com -> Expr Expr -> Num | Expr + Num | Expr - Num | Expr * Num | Expr / Num Num -> Dig |Num Dig Dig -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Paradigmas de Programação - prof Gláucya Carreiro Boechat
Exemplo2 – Priorização em linguagens de Programação 1ª Prioridade : *, /, and, ... 2ª Prioridade : +, -, or, ... 3ª Prioridade : =, >, <, ... Expr -> tExpr | tExpr = tExpr | tExpr < tExpr | tExpr > tExpr Paradigmas de Programação - prof Gláucya Carreiro Boechat
Exemplo2 – Priorização em linguagens de Programação tExpr -> sExpr | tExpr + sExpr | tExpr - sExpr | tExpr or sExpr sExpr -> pExpr | sExpr * pExpr | sExpr / pExpr | sExpr and pExpr pExpr -> Lit | Var | (Exp) Paradigmas de Programação - prof Gláucya Carreiro Boechat
Associatividade de Operadores Associatividade de operadores podem ser indicados pela gramática Exemplo A = B + C + A (adição é associativa) A = B / C / A (divisão não é associativa) Paradigmas de Programação - prof Gláucya Carreiro Boechat
Associatividade de Operadores Exemplo <expr> -> <expr> + <expr> | const (ambígua) <expr> -> <expr> + const | const (não-ambígua) Paradigmas de Programação - prof Gláucya Carreiro Boechat
Árvore de análise associatividade da adição A = B + C + A Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat BNF estendida Adição de novas extensões Uso de Colchetes [ ] no RHS Partes opcionais <proc_call> -> ident [ ( <expr_list> ) ] <seleção> -> if ( <expressão> ) <instrução> [else <instrução>]; Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat BNF estendida Uso de parenteses ( ) no RHS Opções de múltipla escolha, são colocadas dentro de parênteses e separadas por barras verticais <term> -> <term> ( + | - ) const <for_stmt> -> for <var> = <expr> ( to | downto ) <expr> do <stmt> Uso de chaves { } no RHS Indica zero ou repetição indefinida <ident> -> letter { letter | digit } <lista_ident> -> <identificador> { , <identificador> } Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat BNF e EBNF BNF <expr> -> <expr> + <term> | <expr> - <term> | <term> <term> -> <term> * <factor> | <term> / <factor> | <factor> <factor> -> <exp> ** <factor> | <exp> <exp> -> ( <expr> ) | id EBNF <expr> -> <term> { (+ | -) <term> } <term> -> <factor> { (* | / ) <factor> } <factor> -> <exp> { ** <exp> } <exp> -> ( <expr> ) | id Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat Exercícios Traduzir as seguintes seqüências 5 – 6 – 7 5 * 6 * 7 5 * 6 – 7 5 – 3 * 2 – 7 A and B = C A or B = C Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat Exercícios Modificar a sintaxe previamente estabelecida para as expressões sejam avaliadas tendo as comparações com maior precedência (Ex.: A and (B=C)). Refaça a tradução das expressões considerando a nova sintaxe estabelecida. Paradigmas de Programação - prof Gláucya Carreiro Boechat
Paradigmas de Programação - prof Gláucya Carreiro Boechat Exercícios Adicionar os operadores unários ‘++’, ‘--’ e ‘not’. Os operadores ‘++’ e ‘--’ devem ter a mesma prioridade dos seus correspondentes binários, e devem ser permitidos como ‘pré’ ou ‘pós’. O operador ‘not’ deve possuir uma prioridade mais alta do que todos os operadores já definidos. Represente as expressões ‘--a+b’, ‘a+b--’, ‘++a*b’ e ‘not A and B’ Paradigmas de Programação - prof Gláucya Carreiro Boechat