Sintaxe e Semântica. Fases da Compilação. programa fonte

Tamanho: px
Começar a partir da página:

Download "Sintaxe e Semântica. Fases da Compilação. programa fonte"

Transcrição

1 Sintaxe e Semântica mleal@inf.puc-rio.br Fases da Compilação programa fonte tokens parse tree árvore anotada ou outra forma intermediária código intermediário código objeto código objeto otimizado scanner (análise léxica) parser (análise sintática) análise semântica e geração de código intermediário otimização de código (independente da máquina) geração de código objeto otimização de código (dependente da máquina) mleal@inf.puc-rio.br

2 Sintaxe Sintaxe é um conjunto de regras que define a forma de uma linguagem, estabelecendo como são compostas as suas estruturas básicas (palavras). A sintaxe de uma LP é formada por regras léxicas e regras sintáticas: As regras lexicas descrevem as combinações válidas de caracteres que formam os tokens da LP (palavras reservadas, identificadores, operadores, etc). As regras sintáticas descrevem como os tokens podem ser combinados para formar instruções válidas (comandos, expressões, subrotinas, etc). mleal@inf.puc-rio.br 3 Sintaxe - Diagramas Sintáticos Um método simples de descrever a sintaxe de uma LP. Permite visualizar facilmente suas construções sintáticas. Foi usado inicialmente na definição da linguagem Pascal. mleal@inf.puc-rio.br 4

3 Sintaxe - BNF A sintaxe de uma LP usualmento é definida através de um conjunto de regras representadas através de uma gramática livre de contexto. A notação utilizada é conhecida como Backus-Naur Form (BNF). Esta notação utiliza dois conjuntos de símbolos: terminais representam os símbolos da linguagem que está sendo definida, por exemplo: while, for,, =, [. não terminias são abstrações utilizadas para representar as construções da linguagem, e são apresentadas sempre entre <>, como por exemplo: <expressão>, <declaração>, etc. São utilizados ainda dois meta-símbolos: ::= significa é definido como." significa ou." mleal@inf.puc-rio.br 5 Sintaxe - BNF Regras léxicas: <digit>::= <number>::= <digit> <digit><number> -<number> <identifier>::= <letter> <identifier><letter> <identifier><digit> <letter>::= a b c... z <operator>::= + - * / <relation>::= <= >= == > <!= mleal@inf.puc-rio.br 6

4 Sintaxe - BNF Regras sintáticas: <program>::= program <identifier> ; <block> <block>::= <declaration seq> begin <command seq> end. ` <declaration seq>::= ε <declaration><declaration seq> <declaration> ::= var <variable list> : <type>; <type>::= boolean integer real string <command seq>::= <command> <command><command seq> <commmand>::= <variable>=<expression> if <boolean expr> then <command seq> end while <boolean expr> do <command seq> end... mleal@inf.puc-rio.br 7 Sintaxe - BNF As regras léxicas de uma LP são verificadas através de um scanner, que a partir do programa fonte gera uma lista de palavras (tokens) válidos. As regras sintáticas são verificadas através de um parser, que tenta validar a estrutura do programa através da derivação de uma árvore (parse tree) que obedece a descrição (BNF) da LP. mleal@inf.puc-rio.br 8

5 Sintaxe - Exemplo Como derivar a parse tree para a expressão a*x+b : <expression>::= indentifier number -<expression> <expression> <operator> <expression> <expression>::= <expression> <operator> <expression> <expression>::= <expression> <operator> indentifier <expression>::= <expression> + indentifier <expression>::= <expression> <operator> <expression> + indentifier <expression>::= <expression> <operator> indentifier + indentifier <expression>::= <expression> * indentifier + indentifier <expression>::= indentifier(a) * indentifier(x) + indentifier(b) mleal@inf.puc-rio.br 9 Sintaxe - Exemplo Parse Tree expression expression operator + expression identifier (b) expression identifier (a) operator * expression identifier (x) mleal@inf.puc-rio.br 0

6 Sintaxe Uma parse tree contém informações importantes para validar a estrutura sintática do programa, mas que não são efetivamente necessárias para a sua representação. Uma forma mais simples de representar a estrutura sintática de um programa utiliza árvores sintáticas (abstract syntax tree ou simplesmente syntax tree). mleal@inf.puc-rio.br Sintaxe - Exemplo Syntax Tree + * identifier (b) identifier (a) identifier (x) mleal@inf.puc-rio.br

7 Sintaxe - EBNF Uma variação bastante utilizada da notação BNF é conhecida como Extended BNF (EBNF), que incorpora alguns símbolos usados na definição de expressões regulares como * (0 ou mais) e + ( ou mais). <programa>:: = {<comandos> * } A partir da descrição sintática de uma LP em BNF ou EBNF pode-se gerar automaticamente parsers e scanners usando aplicativos como yacc, lex, flex e bison. mleal@inf.puc-rio.br 3 Semântica A semântica descreve o significado de construções sintáticas válidas. Não existe uma notação padrão equivalente a BNF para a descrição da semântica de LPs. Diferentes formalismos foram desenvolvidos para atender a diferentes objetivos. Geralmente uma LP é descrita informalmente, utilizando-se linguagem natural (inglês, português, etc). mleal@inf.puc-rio.br 4

8 Semânticas Formais Semânticas fomais são usadas principalmente para provar propriedades de LPs, construções semânticas e algoritmos. Semântica Operacional - Tem como objetivo descrever como uma computação é processada. Geralmente faz uso de uma máquina abstrata e de regras que descrevem as mudanças de estado associadas a cada comando. Semântica Denotacional - Descreve um programa através de objetos matemáticos como conjuntos, funções, valores e as relações entre estes. Semântica Axiomática Baseada em métodos de dedução lógica, descreve uma linguagem através de axiomas. Usualmente é utilizada para provar propriedades de algoritmos. mleal@inf.puc-rio.br 5 Structural Operational Semantics (SOS) Exemplo de semântica formal que permite provar propriedades de programas ou de estruturas de uma LP. A semântica operacional tradicional especifica uma LP em termos da execução de um programa em uma máquina abstrata. Em SOS o processamento da máquina abstrata segue regras de dedução com a forma: premissa premissa... premissa n condição conclusão mleal@inf.puc-rio.br 6

9 SOS - Exemplo Sintaxe n N = b conjunto dos números inteiros { true, false} id Id = conjunto dos identificadores inteiros bid Bid = conjunto dos identificadores boolenanos iop rop { +, -,*, /} { <, <=, =, >, >=, =!} ie Iexp = conjunto das expressões inteiras be Bexp = conjunto das expressões booleanas cmd Cmd = conjunto dos comandos n : iexp n Num id : iexp id Id ie : iexp ie : iexp ie : iexp ie : iexp iop Iop ie iop ie : iexp ie : iexp ie : iexp rop Rop ie rop ie : bexp be : bexp be : bexp rop Rop be rop be : bexp ie : iexp id Id id : = ie : cmd c : cmd c : cmd c ;c : cmd be : bexp c : cmd c : cmd if be then c else ce : cmd be : bexp c : cmd while be do c : cmd mleal@inf.puc-rio.br 7 SOS - Exemplo Semântica das expressões A memória da máquina abstrata é representada por uma estrutura de dados (sto( sto). Os diferentes estados são representados entre < > e as transições de estado são indicadas por A máquina abstrata possui apenas três funções: applysto(sto,x) recupera o valor da variável x; updatesto(sto,x, n) atualiza o valor da variável x (x=n); compute (op, num, num) calcula o valor da expressão (num op num) mleal@inf.puc-rio.br 8

10 SOS - Exemplo < ie, sto > < ie ', sto > () < ie iop ie, sto > < ie ' iop ie, sto > < ie, sto > < ie', sto > () < n iop ie, sto > < n iop ie ', sto > (3) < n iop n, sto > < compute(iop, n, n ), sto > (4) < id, sto > < applysto( sto, id), sto > Usando estas regras podemos deduzir a semântica da expressão x + y + 6 onde y = 5 e x = 7 ( a) < y, sto > < 5, sto > já que usando (4) temos applysto( sto, y) = 5 ( b) < y + 6, sto > < 5 + 6, sto > usando () ( c) < 5 + 6, sto > < 3, sto > já ( d) < x, sto > < 7, sto > já que usando (4) temos applysto( sto, x) = 7 ( e) < x + y + 6, sto > < 7 + 3, sto > usando () (f) < 7 + 3, sto > < 48, sto > já ( g) < x + y + 6, sto > < 48, sto > que usando (3) temos que usando (3) temos compute( +,5,6) = 3 compute( +,7,3) = 48 mleal@inf.puc-rio.br 9 SOS - Exemplo Semântica dos comandos Para definir a semântica de comandos expandimos a máquina abstrata utilizando duas novas estruturas (in( e out) ) para representar a entrada e a saída de dados. Os estados da máquina abstrata correspondem portanto a tuplas com a forma <in, out, sto>. mleal@inf.puc-rio.br 0

11 Gramática de Atributos Uma gramática de atributos pode ser informalmente definida como uma gramática livre de contexto estendida através do uso de atributos, condições e regras de avaliação. Associa atributos aos diferentes símbolos de uma gramática a partir das produções. Permite definir o significado de produções e impor regras semânticas. Introduz sensibilidade ao contexto, e pode ser usada, por exemplo, para checar o tipo das variáveis e validar expressões. Usualmente é utilizada conjuntamente com rotinas de ação (action routines). mleal@inf.puc-rio.br

12 Gramática de Atributos (+3)* 3 Gramática de Atributos <delcaration>::= var <identifier> <type> ; if <identifier> not in <var-list> then <var-list> (<identifier>, <type>) else error( duplicate variable ) <int expression>::= <identifier> <operator> <number> if gettype(<varlist>, <identifier>) integer then error( wrong type ) mleal@inf.puc-rio.br 4

13 Rotinas de Ações Definem rotinas que são invocadas pelo compilador sempre que uma produção é prevista. Muitos analisadores semânticos são implementados automaticamente através destas construções. <declaration)::= var <identifier>: <type>; {declare_name(identifier, type)}... <expr>::= <expr> <operator> <expr3> {check_types(expr, expr, expr3); expr.val = calc(operator, expr, expr3} mleal@inf.puc-rio.br 5 Semântica Estática X Dinâmica As regras semânticas podem ser classificadas em estáticas ou dinâmicas dependendo do momento em que são checadas (compilação ou em tempo de execução). Exemplos de regras estáticas: Todo identificador deve ser declarado antes de ser usado; Os parâmetros utilizados na chamada de uma função têm o tipo correto. Exemplos de regras dinâmicas: O índice de um array está dentro do limite correto; Variáveis nunca são utilizadas antes de serem inicializadas; Divisão por zero. mleal@inf.puc-rio.br 6