Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que...

81
Um Tradutor Dirigido por Sintaxe Simples • Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso • Dá uma visão geral do processo de compilação

Transcript of Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que...

Page 1: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Um Tradutor Dirigido por Sintaxe Simples

• Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso

• Dá uma visão geral do processo de compilação

Page 2: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Um compilador simples

• Objetivo: traduzir expressões infixas em posfixas9 – 5 + 2 9 5 – 2 +

• Aplicabilidade: computação baseda em pilha (por exemplo, gerador de código para .NET e JVM)

Page 3: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Front-end de um compilador

Analisador léxico

Programa fonte

Parser

Ger. de código intermediário

Tabela de Símbolos

tokens

árvore sintática

Three-address code

Page 4: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Definição de uma linguagem

• Linguagem = sintaxe + semântica• Sintaxe = forma• Semântica = significado

Page 5: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Definição de uma linguagem

• Especificação da sintaxe: – gramática livre de contexto, BNF

(Backus-Naur Form)• Especificação da Semântica:

– normalmente informal (textual)– formal: uso de semântica operacional,

denotacional, de ações, etc.

Page 6: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo: if-else

if ( expression ) statement else statement

Page 7: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo: if-else

if ( expression ) statement else statement

stmt if ( expr ) stmt else stmt

Page 8: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Gramática Livre de Contexto

• Um conjunto de tokens, símbolos terminais• Um conjunto de símbolos não-terminais• Um conjunto de produções, cada produção

consiste de um não-terminal, uma seta, e uma sequencia de tokens e/ou não terminais

• Um não terminal designado como símbolo inicial

Page 9: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo 1

list list + digitlist list - digitlist digit

digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Page 10: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo 1a

list list + digit | list - digit | digit

digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Page 11: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo 2

call id ( optparams )optparams params | params params , param | param

Page 12: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Derivações

• Uma gramática deriva strings a partir do seu símbolo inicial e repetidamente substituindo não-terminais pelo corpo de sua produção

• As sequencias de terminais produzidas desta forma formam a linguagem definida pela gramática

• Exemplos: 9, 9 - 5, 9 - 5 + 2

Page 13: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Parsing

• Problema de pegar uma string de terminais e verificar como derivá-la a partir do símbolo inicial da gramática; caso não seja possível, reportar erros de sintaxe.

• Processo de procurar uma parse-tree para uma dada sequencia de terminais.

Page 14: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Parse Trees

• Mostra graficamente como o símbolo inicial de uma gramática deriva uma string da linguagem.

• Para uma produção A XYZ

Z

A

X Y

Page 15: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Parse Trees

• A raiz é o símbolo inicial• Cada folha é um terminal ou • Cada nó interior é um não-terminal• Se A é um não-terminal e X1, X2,...,Xn são

labels de filhos deste nó, tem que haver uma produção A X1 X2 ... Xn

Page 16: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo

• 9 – 5 + 2

digit

digit

list

list

list

- + 9 5 2

digit

Page 17: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Ambiguidade

• Parse-tree gera uma string, mas uma string pode possuir várias parse-trees, se a gramática for ambígua.

• Solução: usar sempre gramáticas não-ambíguas, ou gramáticas ambíguas com informações adicionais sobre como resolver ambiguidades.

Page 18: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Ambiguidade - Exemplo

• string string + string | string - string | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Page 19: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo: Duas parse trees

• 9 – 5 + 2

string

string

string

string

string -

+

9 5

2string string

string

string

string -

+9

5 2

Page 20: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Associatividade de Operadores

• +, –, * e / são associativos à esquerda, na maioria das linguagens de programação:9 – 5 + 2 é equivalente a (9-5)+2

• Atribuição em C e exponenciação são associativos à direita: a = b = c2**3**4

Page 21: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Associatividade à direita

right letter = right | letterletter a | b | … | z

Page 22: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Precedência de operadores

• 9 + 5 * 2• * tem maior precedência do que +• Usaremos dois não-terminais para

representar os dois níveis de precedência em expressões e um outro para gerar as unidades básicas de expressões.

Page 23: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Precedência de operadores

• expr expr + term | expr – term | termterm term * factor | term / factor | factorfactor digit | ( expr )digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Page 24: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo

• stmt id = expression ; | if ( expression ) stmt | if ( expression ) stmt else stmt | while ( expression ) stmt | do stmt while ( expression ) ; | { stmt }stmts stmts stmt |

Page 25: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Tradução dirigida por sintaxe

• Tradução dirigida associa regras ou trechos de programa às produções de uma gramática.

Page 26: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo

expr expr1 + term

traduza expr1;traduza term;trate + ;

Page 27: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Conceito: Atributo

• Um valor associado a um construtor do programa.

• Exemplos:– Tipo em uma expressão;– Número de instruções geradas;– Localização da primeira instrução gerada por

um construtor;

Page 28: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Conceito: Esquema de tradução (dirigida pela sintaxe)

• Notação para associar trechos de programa a produções de uma gramática

• Os trechos de programa são executados quando a produção é usada durante a análise sintática

• O resultado da execução desses trechos de programa, na ordem criada pela análise sintática, produz a tradução desejada do programa fonte

Page 29: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Notação pós-fixada

• Se E é uma variável ou constante, sua notação pós-fixada é ela mesma;

• Se E é uma expressão da forma E1 op E2, então sua notação pós fixada é E1

’ E2’ op, onde E1

’ e E2

’ são as notações pós-fixadas de E1 e E2 respectivamente;

• Se E é uma expressão com parênteses ( E ), então sua notação pós-fixada é a mesma notação pós-fixada de E1.

Page 30: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo

• (9-5)+2 95-2+

• 9-(5+2) 952+-

• 9-(5+2)*3 952+-3*

Page 31: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Definição dirigida por sintaxe

• Definição dirigida por sintaxe associa a cada símbolo um conjunto de atributos;

• e a cada produção, regras semânticas para computar os valores dos atributos

(Gramática de atributos)

Page 32: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Definição dirigida por sintaxe

1 Dada uma string x, construa uma parse tree para ela;

2 Aplique as regras semânticas para avaliar os atributos em cada nó.

Page 33: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo – valores dos atributos nos nós de uma parse tree

9 - 2+5

expr.t = 95-2+

expr.t = 95- term.t = 2

expr.t = 9

term.t = 9

term.t = 5

Page 34: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Tipos de Atributos

• Atributos sintetizados: seus valores são obtidos a partir dos filhos de um determinado nó;Podem ser calculados através de uma travessia bottom-up;

• Atributos herdados: têm seus valores definidos a partir do próprio nó, de seus pais ou seus irmãos.

Page 35: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo – Definição dirigida por sintaxe

• Produção Regra semânticaexpr expr1 + term expr.t = expr1.t || term.t || ‘+’expr expr1 – term expr.t = expr1.t || term.t || ‘-’expr term expr.t = term.tterm 0 term.t = ‘0’term 1 term.t = ‘1’…term 9 term.t = ‘9’

Page 36: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Travessias

• Travessia em profundidade (depth-first)

• procedure visit (node N) { for (each child C of N, from left to right) { visit(C); } evaluate semantic rules at node N;}

Page 37: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Esquemas de tradução

• Gramática livre de contexto com fragmentos de programas (ações semânticas) embutidos no lado direito das produções.

• Semelhante à definição dirigida por sintaxe, mas com a ordem de avaliação das regras semânticas explicitada.

Page 38: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo 1

• rest + term {print (‘+’) } rest1

term

rest

+ {print(‘+’)} rest1

Page 39: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo 2

• expr expr + term { print (‘+’) } expr expr - term { print (‘-’) }expr termterm 0 { print (‘0’) }term 1 { print (‘1’) }…term 9 { print (‘9’) }

Page 40: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo 2

9

-2

+

5

expr

expr term

expr

term

term

Page 41: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Ações traduzindo 9=5+2 em 95-2+

9

-2

+

5

expr

expr term

expr

term

term{print(‘2’)}

{print(‘9’)}

{print(‘5’)}

{print(‘-’)}

{print(‘+’)}

Page 42: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Parsing

• Processo de determinar como uma string de terminais pode ser gerada por uma gramática

• Conceitualmente é a construção da parse tree

• Mas a parse tree pode não ser efetivamente construída durante a compilação.

Page 43: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Parsing

• Para gramáticas livres de contexto sempre é possível construir um parser com complexidade O(n3) para fazer o parsing de n tokens.

• Na prática, o parsing de linguagens de programação normalmente pode ser feito linearmente.

• Travessia linear da esquerda para a direita, olhando um token de cada vez.

Page 44: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Top-down ou bottom-up parsers

• Refere-se à ordem em que os nós da parse tree são criados.

• Top-down: mais fáceis de escrever “à mão”• Bottom-up: suportam uma classe maior de

gramáticas e de esquemas de tradução;são frequentemente usados/gerados pelas ferramentas de geração automática de parsers.

Page 45: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo

• stmt expr ; | if (expr ) stmt | for ( optexpr ; optexpr ; optexpr ) stmt | otheroptexpr expr |

Page 46: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo

;(

expr

optexpr

stmt

for otheroptexpr ;

expr

optexpr )

stmt

for ( ; expr ; expr ) other

Page 47: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Construindo um parser top-down

1. Para cada nó n, com um não-terminal A, selecione uma das produções de A e construa os filhos de n para os símbolos à direita da produção.

2. Encontre o próximo nó para o qual uma sub-árvore deve ser construída.

Page 48: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Construindo um parser top-down

• Para algumas gramáticas basta uma única travessia da esquerda para a direita da string de entrada.

• Token corrente é chamado de lookahead symbol.

• Exemplo: for ( ; expr ; expr ) other

Page 49: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Backtracking

• A escolha de uma produção pode exigir tentativa-e-erro, voltando para tentar novas alternativas possíveis.

• Predictive-parsing: parsing em que não ocorre backtracking.

Page 50: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Recursive descent parsing

• Método de análise sintática top-down em que um conjunto de procedimentos recursivos é usado para processar a entrada.

• Cada procedimento está associado a um símbolo não-terminal da gramática.

• Predictive parsing é um caso especial de recursive descent parsing em que o símbolo lookahead determina sem ambiguidades o procedimento a ser chamado para cada não-terminal.

Page 51: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo – predictive parsing

stmt for ( optexpr ; optexpr ; optexpr ) stmt

match (for); match (‘(‘); optexpr (); match (‘;‘);optexpr (); match (‘;‘);optexpr (); match (‘)‘); stmt ();

Page 52: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo – predictive parsing

void match (terminal t) { if (lookahead == t) lookahead = nextTerminal else report (“syntax error”);

}

Page 53: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo – predictive parsing (cont.)

void optexpr( ) { if (lookahead == expr) match (expr) ;

}

Page 54: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo – predictive parsing (cont.)void stmt( ) {

switch (lookahead) { case expr: match(expr); match(‘;’); break; case if: match(if); match(‘(‘); match(expr);match(‘)’); stmt(); break;

case for: match(for); match(‘(‘); optexpr(); match(‘;‘); optexpr(); match(‘;‘); optexpr(); match(‘)‘); stmt(); break; case other: match(other); break; default: report(“syntax error”);}

}

Page 55: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Predictive parsing - Problema

• Recursão à esquerda leva a loop em predictive parsers:

expr expr + term | term

A A |

Page 56: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Predictive parsing - Solução

• Reescrever produções tornando-as recursivas à direita:A A | reescrever paraA RR R |

• Exemplo: expressão “”

Page 57: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Sintaxe abstrata x Sintaxe concreta

• Sintaxe abstrata: ignora distinções superficiais de forma, irrelevantes para o processo de tradução.

digit

digit

list

list

list

- +

digit

5 29

5

2

+

-

9

Page 58: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Sintaxe abstrata x Sintaxe concreta (cont.)

• Na árvore sintática abstrata os nós são construções do programa, enquanto que na parse tree os nós são não-terminais.

• Idealmente as duas árvores devem ser próximas.

Page 59: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Reescrevendo a gramática de expressões

• expr expr + term {print (‘+’) } expr expr - term {print (‘-’) }expr termterm 0 {print (‘0’) }…term 9 {print (‘9’) }

Page 60: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Reescrevendo a gramática de expressões

A Aa | Ab | c

A cR

R aR | bR |

Page 61: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Reescrevendo a gramática de expressões (cont.)

A = expr a = + term {print(‘+’)}b = - term {print(‘-’)}c = term

Page 62: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Reescrevendo a gramática de expressões (cont.)

expr term rest

rest + term {print (‘+’) } rest | - term {print (‘-’) } rest

|

term 0 {print (‘0’) }…term 9 {print (‘9’) }

Page 63: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Tradutor em C

void expr () { term(); rest();

}

Page 64: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Tradutor em C

void term () { if (isdigit(lookahead)) { t = lookahead; match(lookahead); print(t);

} else report(“syntax error”);

}

Page 65: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Tradutor em C (cont.)

void rest() { if (lookahead == ‘+’) { match(‘+’); term(); print(‘+’); rest(); } else if (lookahead ==‘-’) { match(‘-’); term(); print(‘-’); rest(); } else { };

}

Page 66: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Otimizaçõesvoid rest ()

{ while (true) { if (lookahead == ‘+’) { match(‘+’); term(); print(‘+’); continue; } else if (lookahead ==‘-’) { match(‘-’); term(); print(‘-’); continue; } break;}

}

Page 67: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Usando um analisador léxico

• Facilita o tratamento de lexemas ao invés de caracteres:– Tratamento de espaços em branco– Tratamento de número maiores que 9

(constantes)– Reconhecimento de identificadores e palavras-

chave.

Page 68: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Estendendo para identificadore e números maiores que 9

expr expr + term {print (‘+’) } | expr – term {print (‘-’) } | termterm term * factor {print (‘*’) } | term / factor {print (‘/’) } | factorfactor ( expr ) | num {print (num.value) }

| id {print (id.lexeme) }

Page 69: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Class Token

int tag

class Token

int value

class Num

string lexeme

class Word

Page 70: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Código do analisador léxico• token scan() { char t;

while(true) { t = getchar(); if (t == ‘ ’ || t ==‘\t’) { } ; else if (t ==‘\n’) line++;

else if (isdigit(t)) { tokenval = t – ‘0’; t = getchar(); while (isdigit(t)) { { tokenval = tokenval * 10 + t – ‘0’; t = getchar(); } ungetc(t,stdin); return token<num,tokenval>; } else …

Page 71: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

A tabela de símbolos

• Interface:– insert(s,t)– lookup(s)

• Palavras reservadas:insert(“div”,div)insert(“mod”, mod)

Page 72: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Geração de código intermediário

• Árvores: e.g. parse trees ou (abstract) syntax trees

• Representações lineares:e.g. three-address code

Page 73: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Construção da Syntax tree

• Classes para representar a hierarquia de construções da Linguagem:

Statements, IfStatements, WhileStatements; Expressions, BinaryExpressions, etc.

Page 74: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

class AST

class Statement class Expression

Expr E;Stmt S;

class IfStmtIdentifier I;Expr E;

class AssignmentStmt

Expr E;Stmt;

class WhileStmt

Page 75: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

class AST

class Statement class Expression

Int IL;

class IntLiteralOperator Op;Expr E1, E2;

class BinaryExprOperator Op;Expr E;

class UnaryExpr

Page 76: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Exemplo

stmt expr ; {stmt.n = new Eval(expr.n); } | if (expr ) stmt {stmt.n = new If(expr.n, stmt.n}

Page 77: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Fluxo de controle

• Desvios condicionais ou incondicionais• o destino pode ser especificado

– pelo operando da instrução– o operando pode especificar um desvio relativo– o destino pode ser especificado simbolicamente, através

de labels

Page 78: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Fluxo de controle - instruções

• ifFalse x goto L• ifTrue x goto L• goto L

Page 79: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Fluxo de controle – exemplo 1class IfStmt extends Stmt {

Expr E; Stmt S;

public If (Expr x, Stmt y) { E = x; S = y; after = newlabel(); }

public void gen() { Expr n = E.rvalue(); emit(“ifFalse ”+n.toString()+“goto ”+after); S.gen() emit(after +”:“); }

}

Page 80: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

Código para calcular expr em x

ifFalse x goto after

after

Código para stmt1

ifFalse x goto after

Page 81: Um Tradutor Dirigido por Sintaxe Simples Apresenta de forma resumida boa parte do assunto que veremos em detalhes no restante do curso Dá uma visão geral.

If ( peek == ‘\n’ ) line = line + 1;

Lexical Analyser

Resumo

<if> <(> <id,”peek”> <eq> <const,’\n’> <)> <id,”line”> <assign> <id,”line”> <+> <num,1>

<;>

Syntax Directed Translator

1: t1 = (int) ‘\n’2: ifFalse peek == t1 goto 43: line = line + 14:

assign

if

eq

peek line

line

+

1

(int)

‘\n’