You are on page 1of 105

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Compiladores
Jos Carlos Bins Filho e

14 de Abril de 2011

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Contedo u

Anlise Lxica a e
Autmatos Finitos e Expresses Regulares. o o Especicao e reconhecimento de tokens. ca Geradores de Analisadores Lxicos. e

Anlise Sinttica a a
Gramticas Livres de Contexto. a Anlise Sinttica Descendente. a a Anlise Sinttica Ascendente. a a Geradores de Analisadores Sintticos. a

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Contedo (continuao) u ca

Traduo Dirigida por Sintaxe ca


Ordem de avaliao. ca Esquemas de traduo. ca

Gerao de Cdigo Intermedirio. ca o a


Three-Address Code.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Avaliao ca

MF =

3P1 +4P2 +3A 10

6.0

Prova Substitutiva no nal do semestre para recuperar a nota de 1 prova. Datas:


Prova 1: 05/05/2011 Prova 2: 06/07/2011 Prova Sub: 07/07/2011

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Bibliograa

AHO, Alfred V.; LAM, Monica S.; SETHI, Ravi; ULLMAN, Jerey D.. Compiladores: princ pios, tcnicas e ferramentas. e 2a ed., Pearson, 2007. RICARTE, Ivan Luiz Marques. Introduo ` Compilao. ca a ca Elsevier, 2008. LOUDEN, Kenneth. Compiladores: princ pios e prticas. a Thomson Pioneira, 2004.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Introduo ca

O que um compilador? e

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Introduo ca

O que um compilador? e O que linguagem de alto n e vel?

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Introduo ca

O que um compilador? e O que linguagem de alto n e vel? O que linguagem de mquina? e a

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Introduo ca

O que um compilador? e O que linguagem de alto n e vel? O que linguagem de mquina? e a Compilador x Traduo? ca

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Introduo ca

O que um compilador? e O que linguagem de alto n e vel? O que linguagem de mquina? e a Compilador x Traduo? ca Histrico - Primeiro Compilador? o

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Introduo ca

O que um compilador? e O que linguagem de alto n e vel? O que linguagem de mquina? e a Compilador x Traduo? ca Histrico - Primeiro Compilador? o
Fortran - 1950 C - 1970

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Introduo ca

O que um compilador? e O que linguagem de alto n e vel? O que linguagem de mquina? e a Compilador x Traduo? ca Histrico - Primeiro Compilador? o
Fortran - 1950 C - 1970

Outras aplicaes das tcnicas de compilao? co e ca

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Introduo ca

O que um compilador? e O que linguagem de alto n e vel? O que linguagem de mquina? e a Compilador x Traduo? ca Histrico - Primeiro Compilador? o
Fortran - 1950 C - 1970

Outras aplicaes das tcnicas de compilao? co e ca

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Fases de um compilador

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Fases de um compilador (continuao) ca

Pr-processador: L cdigo fonte e transforma este cdigo e e o o fonte de forma a prepar-lo para compilao. Ex: transforma a ca C++ em C, inclui arquivos, executa denes, etc... Anlise Lxica: L o cdigo fonte e gera um conjunto de a e e o tokens para os lexemas encontrados.
Lexema: conjunto de caracteres do programa fonte que representa um elemento sinttico. Palavra vlida em uma a a linguagem. No caso, na Gramtica livre de contexto que dene a a linguagem de programao usada. ca Token: Classicao lxica de um lexema. ca e

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Lexema x Token
Ex: a = b + c Lexema a = b + c Token Identicador Caracter em branco Operador de atribuio ca Caracter em branco Identicador Caracter em branco Operador de soma Caracter em branco Identicador Caracter em branco

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Fases de um compilador (continuao) ca

Anlise sinttica: Recebe os tokens e usa as regras de sintaxe a a (produes) para agrupa-los em estruturas sintticas. Atualiza co a a tabela de s mbolos. Anlise semntica: Testa o signicado das palavras em a a relao ao contexto onde elas se encontram (espao e tempo). ca c Ex: escopo, declarao, tipo, etc... ca Gerao de cdigo intermedirio: Cria um cdigo numa ca o a o linguagem simples sem uso de registradores.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Fases de um compilador (continuao) ca


Otimizao de cdigo: Reduz o tamanho e aumenta a ca o velocidade do cdigo intermedirio. Tem grande inuncia na o a e performance nal do cdigo. Ex: remover comandos que no o a sero executados; unir loops; desenrolar loops; acessar tabelas a esparsas de forma eciente Gerao de cdigo: Converte o cdigo intermedirio numa ca o o a sequncia de instrues de mquina. e co a Tabela de s mbolos: Tabela que armazena identicadores e seus atributos. E usada durante todo o processo de compilao. Exemplo de atributos: tipo, escopo, linha de ca declarao, valor (para constantes), etc... ca

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Front End x Back End

Separao de Front End (anlise) e Back End (s ca a ntese): Facilita a criao de compiladores porque permite reutilizao ca ca de cdigo o Front End: se preocupa com a linguagem sendo compilada Back End: se preocupa com a mquina onde o cdigo ser a o a gerado

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Linguagens formais
Alfabeto (): Conjuntos de s mbolos usados numa linguagem. O s mbolo representa a palavra vazia. Linguagem (L): Conjunto de palavras (sequncia de s e mbolos do alfabeto) Expresso regular: Gerador recursivo de palavras pertencentes a a uma linguagem.
Todo s mbolo do alfabeto ( ) uma ER e Se 1 uma ER e 2 uma ER ento: e e a
1 2 uma ER (concatenao) e ca 1 + 2 uma ER (concatenao) e ca 1 uma ER (fechamento de Kleene/repetio) e ca () uma ER e

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Linguagens formais
Notaes Alternativas: co
1 ? : zero ou uma repetio ca + 1 : uma ou mais repeties co 1 |2 : alternativa

Exerc cios:
D exemplos de palavras geradas pelas expresses regulares e o abaixo. Diga que linguagem representada pela expresso e a regular.
0 1 (0 10 10 10 ) (0 + 1) (0 1 )

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Linguagens formais
Autmatos Finitos: Reconhecedor de palavras pertencentes a o uma linguagem. Normalmente representado gracamente.
 : Nodo ou Estado  - : Transio ca

Execuo: As transies so marcadas por s ca co a mbolos. Quando um s mbolo da palavra lido a transio marcada com aquele e ca s mbolo a partir do estado atual efetuada. Se no h e a a nenhuma transio a partir do estado atual marcada pelo ca s mbolo lido ento a palavra no pertence a linguagem. Se o a a estado atual um estado nal e no existem mais s e a mbolos a serem lidos ento a palavra reconhecida como pertencendo a a e linguagem.
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Linguagens formais

Representando estados iniciais e nais:


  : Inicial      + : Final   

Todo autmato nito tem uma expresso regular o a correspondente. Se o autmato determin o e stico no pode a haver transio com o s ca mbolo nem duas ou mais transies co partindo do mesmo estado com o mesmo s mbolo

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Linguagens formais

Exerc cios:
D a ER para o autmato abaixo. e o

D o AFD para a ER ab ba e

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Linguagens formais
Gramticas: a
Uma gramtica um mecanismo para gerar a e sentenas/palavras de uma Linguagem. Uma Gramtica c a e denida por uma quadrupla G=N,T,S,P onde: N o conjunto e de s mbolos no Terminais, T o conjunto de s a e mbolos terminais do alfabeto () da linguagem, S o s e mbolo inicial (onde S N), e P o conjunto de regras de produo que e ca descreve como os no-terminais devem ser derivados. a Exemplo: G1 = {{S, B}, {0, 1}, S, P} P: S B B 0B B 1B B

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Linguagens formais
Gramticas (continuao): a ca
Pode-se representar produes de forma reduzida unindo-se o co lado direito das mesmas por um s mbolo | (desde que o mesmo no faa parte da linguagem). Ex: B 0B|1B| a c e equivalente as 3 produes precedentes. co Uma gramtica dita regular se as suas produes so do tipo: a e co a w e w , onde e N e w T*. Gramticas a regulares geram linguagens regulares que podem ser representadas tambm por expresses regulares e autmatos e o o nitos. Uma gramtica livre de contexto se suas produes so do a e co a tipo: onde N e (N T ) . Linguagens de programao so normalmente representadas por gramticas ca a a livres de contexto.
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Linguagens formais
Lista de Exerc cios:
1- Diferencie gerador de Linguagem de Reconhecedor de Linguagem e d exemplos. e 2- Mostre um autmato nito para a linguagem de todas as o sentenas em {a,b} que terminem em nmero par de as. c u 3 - D uma expresso regular para a linguagem de todos os e a nmeros fracionrios com sinal. u a 4- D uma gramtica para a linguagem e a L = {an b n |n = 1, 2, 3, ...}. 5- Mostre um Autmato Finito, se existe, para a linguagem L. o 6- Diferencie Linguagem Livre de Contexto de Linguagem sens ao contexto. vel 7- D o autmato nito e uma rvore de derivao mais a e o a ca esquerda para a linguagem abaixo e para a sentena id + id * c id. E E + E |E E |id
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica a e

O analisador lxico l o programa fonte caracter a caracter e e e produz uma sequncia de tokens que so usados pelo e a analisador sinttico. a J que o analisador lxico a unica parte do compilador que a e e l todo o programa ele muitas vezes responsvel por realizar e e a tarefas acessrias como retirar caracteres brancos, o comentrios, etc... a Embora o analisador lxico seja a parte mais simples do e compilador em algumas linguagens a analise lxica pode ser e bastante complexa.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica a e
Exemplos de diculdades:
Em Fortran: Do 5 I = 1,25 Do 5 I = 1.25 Em PLI: (Comando Do) (Atribuio da varivel Do5I) ca a

If then then then = else; else else = then;

Um analisador lxico nada mais do que um classicador de e e lexemas em tokens. Uma expresso regular normalmente a e suciente para representar lexemas, portanto expresses o regulares so usadas para esta tarefa. a Exerc cio: D as ER para os tokens abaixo: e
Nmeros inteiros com sinal u Identicadores em C++ Comentrios em C++ a
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica a e
As expresses regulares fornecem uma forma conveniente de o especicar tokens, mas elas so geradores e portanto dif a ceis de implementar em forma de programas. Os autmatos nitos, no entanto, tem o mesmo poder de o representao mas so reconhecedores e portanto se prestam ca a melhor ` tarefa. Alm disto existem algoritmos capazes de a e converter facilmente uma expresso regular para um autmato a o nito. No entanto, isto no to fcil, pois existem normalmente a e a a centenas de tokens numa linguagem de programao cada um ca com a sua expresso regular e correspondente autmato nito. a o Todos estes autmatos devem ser unidos para gerar um unico o autmato para a linguagem. Este autmato nal ser ento o o a a implementado e esta implementao o analisador lxico. ca e e
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica a e

Exerc cio: Faa o autmato para os seguintes tokens e tente c o uni-los:


Palavra reservada IF Identicador Nmero inteiro u

Um autmato pode ser implementado de duas maneiras o bsicas: a


Como um algoritmo que executa o autmato diretamente. o Como um algoritmo que executa um autmato dado sob forma o tabular.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica: Exemplo de implementao direta a e ca


int buer, usou-buer; void le-caracter(char *c) { if (usou-buer) { usou-buer = 0; *c = buer; } else fgetc(fp,c); } void devolve caracter(char c) { usou buer = 1; buer = c; } char automato dir() { char c;
Jos Carlos Bins Filho e Compiladores

int estado, m, erro; estado = m = erro = 0; while (!m) { switch (estado) { case 0: le caracter( & c); if (c >= 0 && c <= 9 ) estado = 0; elseif (c == + || c == - ) estado = 1; else { devolve caracter; m = erro = 1; }; break;

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica: Exemplo de implementao direta (cont) a e ca


devolve caracter; case 1: le caracter(&c); m = erro = 1; if (c >= 0 && c <= 9) }; estado = 2; break; else { } devolve caracter; } m = erro = 1; } }; main() { break; automato dir(); case 2: le caracter(&c); if (erro == 0) if (c == EOF) printf(sentena aceita\n); c m = 1; else else if (c >= 0 && c <= 9) printf(sentena rejeitada\n); c estado = 2; } else {
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica: Exemplo de autmato tabular a e o


0 0 0 2 2 1 1 0 2 2 2 2 0 2 2 3 3 0 2 2 4 4 0 2 2 Colunas 5 6 7 5 6 7 0 0 0 2 2 2 2 2 2 8 8 0 2 2 9 9 0 2 2 10 + 1 -1 -1 11 1 -1 -1

Entrada 0 1 2 Estado

Obs: para passar de um autmato para um analisador lxico, o e necessrio devolver o token cada vez que se chega a um e a estado nal o que pode acontecer antes de se chegar ao m da entrada. Portanto a tabela tem que ter alguma maneira de identicar um estado nal, o que no foi feito acima. a
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica: Exemplo de autmato tabular a e o


int buer, usou-buer; void le-caracter(char *c) { if (usou-buer) { usou-buer = 0; *c = buer; } else fgetc(fp,c); } void devolve caracter(char c) { usou buer = 1; buer = c; } int coluna(char c) { if (isdigit((int)c)) return (int)c; else if (c == +) return 10; else if (c == -) return 11; else return 1; } char automato tab(int tab[3][12]) { char c;

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise Lxica: Exemplo de autmato tabular a e o


int estado, m, erro; estado = m = erro = 0; while (!m) { main() { le caracter(& c); int tab[3][12]; if (c == EOF) cria tabela(tab); m = 1; automato tab(tab); else if (tab[estado][coluna(c)] ! = -1) if (erro == 0) estado = tab[estado][coluna(c)]; printf(sentena aceita\n); c else { else devolve caracter; printf(sentena rejeitada\n); c m = erro = 1; } } } }
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Lex

Gerador de analisadores lxicos. e Recebe como entrada expresses regulares, regras de execuo o ca e cdigo em C e gera um analisador lxico atravs da o e e implementao de um autmato tabular. ca o Existem vrias implementaes free do Lex, nos vamos usar a co o Flex.
Veja manual do Flex no moodle. Se o Flex no est instalado na sua mquina instale de a a a http://sourceforge.net/projects/gnuwin32/les/ex/2.5.4a1/ex-2.5.4a-1.exe/download

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Resumo do Lex
Formato do cdigo fonte: o
Identicador das Expresses regulares seguidos das prprias o o e/ou cdigo em C comeando na coluna 2 ou maior o c Separador (%%) Identicadores de expresses ou expresses e regras de o o execuo ca Separador (%%) Cdigo auxiliar em C. A funo yywrapp deve ser declarada o ca mesmo que vazia.

As regras de execuo so compostas por qualquer cdigo em ca a o C. Normalmente este cdigo salva o nomes (identicadores) e o valores das variveis/constantes, e retorna o token a correspondente ao lexema.
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Resumo do Lex
Car | ? * + [] () . \ {} Expresses o Signicado Alternativa Zero ou uma repetio ca Zero ou mais repeties co Uma ou mais repeties co Sequncia de alternativas e Parentizao de expresses ca o Qualquer caracter Caracter branco Caracter especial Identicador de expresso a Regulares Comentrio a

[abc] [A-Za-z] (a | b)*

\t O identicador tem que ter sido declarado anteriormente

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Exemplos do Lex

Exemplo de Cdigo do Lex: I - Analisador lxico primnitivo o e


Comando if-then-else Numeros Ponto-utuante Expresses relacionais o Atribuio ca

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Exemplo I
delim ws letra digito id numero mcmd %% {ws} if then else < <=
Jos Carlos Bins Filho e Compiladores

[ \t\n] {delim}+ [A-Za-z] [0-9] {letra}({letra}|{digito})* {digito}+({digito}+)?(E[+]?{digito}+)? ; { { { { { { /* faz nada */} printf(IF found \n);} printf(THEN found \n);} printf(ELSE found \n);} printf(RELOP found \n); } printf(RELOP found \n); }

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Exemplo I
== { printf(RELOP found \n); } <> { printf(RELOP found \n); } > { printf(RELOP found \n); } >= { printf(RELOP found \n); } = { printf(ATRIB found \n); } {id} { printf(ID found \n); } {numero} { printf(NUMBER found \n);} {mcmd} { printf(COMMAND END found \n);} . { printf(Error: found %s \n, yytext);} %% main() { yylex(); printf(done it !!\n); } int yywrap() {}
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Exemplos do Lex

Exemplos de Cdigo do Lex: continuao o ca


II - Contador de caracteres e linhas (nrocar.lex)

Exemplos de Cdigo do Lex: usando cdigo C o o


III - Encontrar um token numa linha espec ca (token from line.lex) IV - Contar quantos tokens tem numa linha (tokens in line.lex)

Exemplos de Cdigo do Lex: chamado por outro programa: o


V - Programa que chama o lex (prog.lex e programa.c)

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Tabela de s mbolos e Anlise sinttica a a


A tabela de s mbolos uma estrutura gerada por varias fases e do compilador para armazenar informaes sobre variveis, co a constantes, funes e procedimentos de um cdigo fonte. co o A tabela de s mbolos guarda atributos dos objetos armazenados nela. Alguns atributos importantes so: a
Identicador Tipo Escopo Limite (vetores) Nmero e tipo de parmetros (funes) u a co Outros: linha de declarao; erro na declarao (declarao ca ca ca duplicada, etc...)

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Tabela de s mbolos e Anlise sinttica a a

A tabela de s mbolos pode comear a ser constru na c da anlise lxica com a incluso de um identicador na tabela de a e a s mbolos, mas os atributos s sero conhecidos na anlise o a a sinttica e semntica. a a Por isto comum s incluir o identicador na tabela quando a e o sua declarao for identicada na anlise sinttica. ca a a Durante a compilao, cada vez que um token identicador ca e reconhecido a tabela de s mbolos acessada para ver se o e mesmo j foi declarado, e se necessrio recuperar alguns dos a a seus atributos.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Tabela de s mbolos e Anlise sinttica a a

Tipicamente existem 5 tipos de procedimentos que so usados a para acesso a uma tabela de s mbolos:
Incluso de um identicador na tabela de simbolos a Excluso de um identicador da tabela de s a mbolos (geralmente uma varivel temporria) a a Incluso de um ou mais atributos para um identicador a Recuperao de um ou mais atributos para um identicador ca Alterao de um atributo para um identicador ca

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Tabela de s mbolos e Anlise sinttica a a

As tabelas de s mbolos so normalmente constru a das por listas lineares, rvores binrias ou tabelas de hash. Normalmente as a a suas entradas no so homogneas uma vez que os objetos a a e podem ter atributos diferentes. Ex: uma funo tem ca parmetros enquanto variveis no o tem. a a a Trabalho 1 (A): Dado o programa em C a seguir, idealize uma tabela de s mbolos e a preencha usando o Lex.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Tabela de s mbolos e Anlise sinttica a a


main(int argc, char **argv) { double x,y,n,v, v1,v2,v3; x = atof(argv[1]); y = atof(argv[2]); n = atof(argv[3]); v1 = (x/n - y/n); v2 = (x+y)/(n+n); v3 = (1- v2); v = v1 / sqrt(v2*v3*(n+n)/(n*n)); printf(%f \n,v); }

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Tabela de s mbolos e Anlise sinttica a a

Trabalho 1 (B): Programe 2 funes para acessar a tabela que co voc criou: e
int inclui id(char * id, int tipo): funo que recebe um ca identicador e o correspondente tipo (voc dene os valores e usados para cada tipo, mas deixe o valor 0 livre), inclui o identicador e o tipo na tabela e retorna 1 se tudo correu bem ou 0 se houve algum erro. int tipo id(char * id): funo que recebe um identicador e ca devolve o correspondente tipo ou 0 se houve algum erro.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica a a
Agrupa itens lxicos nas diversas unidades sintticas, e a construindo a rvore sinttica utilizando uma srie de regras a a e de sintaxe (ou produes) que constituem a gramtica da co a linguagem fonte. Usam gramticas livres de contexto para representar a linguagens de programao. Algumas construes das ca co linguagens no podem ser representadas por gramticas livres a a de contexto, mas estas construes so poucas e o problema co a e facilmente solucionado modicando-se a linguagem. Erros: Um analisador sinttico faz o reconhecimento de a sentenas da linguagem. Caso haja erros (sentena no c c a reconhecida) o analisador deve reportar o erro e se poss vel recuperar o seu estado, o que pode ser bastante dif cil.
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica: Gramtica Livres de Contexto a a a


Gramticas Livres de Contexto: Uma Gramtica Livre de a a Contexto (GLC ou CFG) uma quadrupla T, N, I, P onde: e
T o conjunto de terminais (T ) e N o conjunto de no terminais e a I o s e mbolo no terminal inicial a P o conjunto de produes do tipo onde N e e co (N T ) .

Ex:G = ({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , +}, {list, digit}, list, P) P: list list + digit list list - digit list digit digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica: Derivao gramatical a a ca

Uma gramtica deriva sentenas a partir do seu s a c mbolo inicial e repetidamente substituindo no-terminais pelo corpo a de sua produo ca Todas as poss veis sequncias de terminais (sentenas) e c produzidas desta forma formam a linguagem denida pela gramtica a Exemplos para a gramtica do slide anterior 9, 9 - 5, 9 - 5 + 2 a

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica: Parsing a a

O problema de pegar uma string de terminais e vericar como deriv-los a partir do s a mbolo inicial da gramtica chamado a e de parsing, e o programa que faz isto de parser. O processo de parsing, portanto, envolve procurar uma `rvore a de derivao (parse-tree) para uma dada sequncia de ca e terminais. Caso no seja poss achar a `rvore de derivao para o a vel a ca string de entrada deve-se reportar erro de sintaxe.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao a a ca


Mostra gracamente como o s mbolo inicial de uma gramtica a deriva uma string da linguagem. Exemplo: 9 - 5 + 2

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao a a ca


Exerc cio: Dada a gramtica: a G = ({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , +}, {list, digit}, list, P) P: list list + list list list - list list digit digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Exemplo: Monte as `rvores de derivao para as sentenas a ca c abaixo:
1+2 5-2-3 4-2+6-7

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao:Ambiguidade a a ca


Uma `rvore de derivao gera uma unica sentena, mas uma a ca c sentena pode possuir vrias `rvores de derivaes diferentes. c a a co Se uma sentena tem mais de uma `rvore de derivao mais ` c a ca a esquerda a gramatica/linguagem da sentena amb c e gua. Soluo: Usar sempre linguagens no amb ca a guas ou usar informaes adicionais para desambigu-las co a Tipo de informao capaz de retirar ambiguidade de uma ca linguagem/gramtica. a
Precedncia de operadores e Associatividade de operadores Escopo

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao:Ambiguidade a a ca


Associatividade de operadores
Na maioria das linguagens de programao: ca
+, , * e / so associativos ` esquerda a a atribuio e exponenciao so associativos ` direita ca ca a a

Exemplo para atribuio: ca atrib id id = atrib | id a | b | ... | z

Exemplo: Derive x = y = z Obs: se a associatividade ` esquerda isto pode gerar uma ea gramtica recursiva ` esquerda. Na hora de criar o parser uma a a gramtica recursiva ` esquerda pode causar recurso innita. a a a

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao:Ambiguidade a a ca


Precedncia de operadores e
Na maioria das linguagens de programao: ca
* e / tem maior precedncia que + e e

Exemplo para expresses: o expr term factor digit expr + term | expr - term | term term * factor | term / factor | factor digit | ( expr ) 0|1|2|3|4|5|6|7|8|9

Obs: Note a recusividade ` esquerda. a Exerc cios: Derive:


3+2-5/6*2 (0+(1-3)*2) 1+(2*3-(4+5/6)*7-8)*(9/(1+2))

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao:Ambiguidade a a ca


Soluco do ultimo exerc a cio: Obs: por falta de espao apenas c a derivao mostrada. ca e expr expr + term term + term factor + term digit + term 1 + term 1 + term * factor 1+ factor * factor 1 + (expr) * factor 1 + (expr - term) * factor 1 + (expr - term - term) * factor 1 + (term * factor - term - term) * factor 1 + (factor * factor - term - term) * factor 1 + (digit * factor - term - term) * factor 1 + (2 * factor - term - term) * factor 1 + (2 * digit - term - term) * factor 1 + (2 * 3 - term - term) * factor 1 + (2 * 3 - term * factor - term) * factor
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao:Ambiguidade a a ca


continuao ca 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+
Jos Carlos Bins Filho e Compiladores

(2 (2 (2 (2 (2 (2 (2 (2 (2 (2 (2 (2

* * * * * * * * * * * *

3 3 3 3 3 3 3 3 3 3 3 3

( ( ( ( ( ( ( ( ( ( ( (

expr) * factor - term) * factor expr + term) * factor - term) * factor term + term) * factor - term) * factor factor + term) * factor - term) * factor digit + term) * factor - term) * factor 4 + term) * factor - term) * factor 4 + term / factor) * factor - term) * factor 4 + factor / factor) * factor - term) * factor 4 + digit / factor) * factor - term) * factor 4 + 5 / factor) * factor - term) * factor 4 + 5 / digit) * factor - term) * factor 4 + 5 / 6) * factor - term) * factor

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao:Ambiguidade a a ca


continuao ca 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+
Jos Carlos Bins Filho e Compiladores

(2 (2 (2 (2 (2 (2 (2 (2 (2 (2 (2 (2

* * * * * * * * * * * *

3 3 3 3 3 3 3 3 3 3 3 3

( ( ( ( ( ( ( ( ( ( ( (

4 4 4 4 4 4 4 4 4 4 4 4

+ + + + + + + + + + + +

5 5 5 5 5 5 5 5 5 5 5 5

/ / / / / / / / / / / /

6) 6) 6) 6) 6) 6) 6) 6) 6) 6) 6) 6)

* * * * * * * * * * * *

digit - term) * factor 7 - term) * factor 7 - factor) * factor 7 - digit) * factor 7 - 8) * factor 7 - 8) * (expr) 7 - 8) * (term) 7 - 8) * (term / factor) 7 - 8) * (factor / factor) 7 - 8) * (digit / factor) 7 - 8) * (9 / factor) 7 - 8) * (9 / (expr))

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

` Anlise sinttica: Arvore de derivao:Ambiguidade a a ca

continuao ca 1+ 1+ 1+ 1+ 1+ 1+ 1+ 1+

(2 (2 (2 (2 (2 (2 (2 (2

* * * * * * * *

3 3 3 3 3 3 3 3

( ( ( ( ( ( ( (

4 4 4 4 4 4 4 4

+ + + + + + + +

5 5 5 5 5 5 5 5

/ / / / / / / /

6) 6) 6) 6) 6) 6) 6) 6)

* * * * * * * *

7 7 7 7 7 7 7 7

8) 8) 8) 8) 8) 8) 8) 8)

* * * * * * * *

(9 (9 (9 (9 (9 (9 (9 (9

/ / / / / / / /

(expr + term)) (term+term)) (factor+term)) (digit+term)) (1 + term)) (1 + factor)) (1 + digit)) (1 + 2))

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica a a
Exerc cios: Construa uma gramtica que represente a sintxe a a de uma declarao de registro da seguinte forma: ca struct id { tipo id[,id[id[,id. . . ]]]; [tipo id[,id[id[,id. . . ]]]]; ... } Exemplo: struct circulo { int xc, yc; oat raio; }
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica a a

Exemplo de gramtica: a stmts stmt stmts stmt | stmt id = expr; | if (expr) stmt; | if (expr) stmt else stmt; | while (expr) stmt; | do stmt while (expr); | {stmt}

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica a a

Um analisador sinttico (parser) utiliza substituies para a co reconhecer uma sentena c Tipos de analisadores sintticos (parsers) a
Descendente (Top-down): ` partir do s a mbolo inicial da gramtica e por derivaes sucessivas chega-se ` sentena a a co a c ser reconhecida. Ascendente (Bottom-up): ` partir da sentena a ser a c reconhecida e por substituies/redues sucessivas chega-se co co ao s mbolo inicial. Este o mtodo mais usado. e e

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica a a
Exemplo: Derivao de w = abc na gramtica abaixo ca a S AB|C A a B bc C c Top-down Bottom-up Entrada Derivao ca Entrada Pilha abc$ S abc$ $ abc$ AB bc$ a bc$ aB bc$ A $ abc c$ Ab $ Abc $ AB $ S
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente a a

Criao da rvore gramatical a partir do s ca a mbolo inicial Pode ser vista como uma tentativa de achar a derivao mais ca ` esquerda para uma sentena de entrada a c E chamada de LL(K), onde:
L: Left-to-right scan L: Leftmost derivation K: nmero de lookaheads u

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente a a


Fatorao: ca
Uma gramtica dita no-fatorada se possue mais de uma a e a produo para um no-terminal comeando pelo mesmo ca a c s mbolo Gramticas no-fatoradas so problemticas para parsers a a a a descendentes porque no poss denir `-priori qual a e vel a produo deve ser usada. ca Solues: co
Backtracking: Quando for constatado erro o parser retrocede. Parser descendente recursivo com retrocesso. Fatorar a Gramtica: Sempre poss e mais rpido que a vel e a usar backtracking.Parse descendente preditivo.

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Fatorao a a ca

Exemplo: Gramtica no fatorada a a S A aAc ab | a aAc aabc (erro / backtrack) aac (aceita sentena) c

Sentena: W = aac c Derivao: S ca

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Fatorao a a ca

Fatorando a gramtica: Dadas as produes: a co


A 1 |2 |3 | . . . |n |1 |2 |3 | . . . |m onde , 1 , 2 , 3 , . . . , n , 1 , 2 , 3 , . . . , m (N T )

estas produes podem ser fatoradas ` esquerda criando-se as co a produes: co A B B|1 |2 |3 | . . . |m 1 |2 |3 | . . . |n

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Fatorao a a ca


Exerc cio: Fatore as gramticas abaixo: a 12S E O C N stmts stmt S | (S) | (S > S) | p | q id | id O id | C +|*|-|/ N | N.N 0 | 1 |...| 9 stmts stmt | stmt id = expr; | if (expr) stmt; | if (expr) stmt else stmt; | while (expr) stmt; | do stmt while (expr); | {stmt}

3-

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Recurso ` esquerda a a a a

Recurso ` esquerda: a a
Uma gramtica recursiva ` esquerda se existe um a e a no-terminal A para o qual A A . a Existem dois casos poss veis de recurso ` esquerda. a a
Direta: onde existe uma produo do tipo A A ca Indireta: mais complexo onde a recurso no direta mas a a e ocorre entre varias produoes c

Um parser descendente no funciona se a gramtica da a a linguagem recursiva ` esquerda e a

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Recurso ` esquerda a a a a


Eliminando a recurso direta ` esquerda: Dadas as produes: a a co
A A1 |A2 |A3 | . . . |An |1 |2 |3 | . . . |m onde 1 , 2 , 3 , . . . , n (N T ) , e 1 , 2 , 3 , . . . , m (N T ) e no comeam por A a c

estas produes podem ser substitu co das por: A B 1 B|2 B|3 B| . . . |m B 1 B|2 B|3 B| . . . |n B| S(S)S | a | (L) | a L,S | S

Exerc cios: 1- S 2S L

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Recurso ` esquerda a a a a

Eliminando a recurso ` esquerda (direta e indireta): a a


Usa-se o algoritmo descrito na prxima pgina o a Para que algoritmo funcione a gramtica no pode ter ciclos a a (A A) e nem produes vazias (A ). co Algoritmo para eliminao de recurso ` esquerda: ca a a
Entrada: Gramtica G sem ciclos ou produoes vazias. a c Saida : Gramtica equivalente sem recurso ` esquerda mas a a a com poss veis produoes vazias. c

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Recurso ` esquerda a a a a

Algoritmo para eliminao de recurso indireta ` esquerda: ca a a Ordene os no-terminais da gramtica (A1 , A2 , A3 , . . . An ) a a Para i = 1 ` n a
Para j = 1 ` i-1 a
Troque cada produo da forma Ai Aj pela produo ca ca Ai 1 |2 |3 | . . . |m onde Aj 1 |2 |3 | . . . |m Elimine a recurso direta ` esquerda gerada (se houver) a a

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Recurso ` esquerda a a a a


Exemplo: S A Aa | b Ac | Sd |

Ordene os no-terminais da gramtica: S, A a a Para S (i=1, j=0) : No faz nada a Para A (i=2, j=1) existe A Sd ento substitui S pelas a produes de S: co A Ac | Aad | bd | Eliminando a recurso direta ` esquerda a a A bdB | B B cB | adB | A gramtica nal : a e S Aa | b A bdB | B B cB | adB |
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Recurso ` esquerda a a a a

Exerc cios: 1- S A 2E T F

AS | b SA | a E+T|E-T|T T*F|T/F|F (E) | id

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Produoes vazias a a c


Para se fazer um parser descendente deve-se eliminar as produes vazias co Teorema: Toda linguagem livre de contexto (L) que no a contenha a palavra vazia pode ser representada por uma gramtica sem a produo vazia. a ca Corolrio: Se L ento L = L {} pode ser representado a a por uma GLC sem produes vazias. co Eliminando produes vazias: co
Descobrir as variveis que so anulveis (A ) a a a Para cada no terminal (A) anulavel: Criar novas produes a co substituindo de todas as maneiras poss veis todas as ocorrencias de A do lado direito por vazio. No incluir a a produo vazia. ca
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Produoes vazias a a c


Exemplo S Aa | b A bdB | B B cB | adB |
S no anulvel a e a B anulvel (pois existe B ) e a A anulvel (pois existe A B que anulvel) e a e a Cria as produes: B c|ad substituindo B por vazio co Cria as produes : A bd Substituindo B por vazio co Cria as produes : S a Substituindo A por vazio co O resultado ca:

S A B
Jos Carlos Bins Filho e Compiladores

Aa | b | a bdB | B | bd cB | adB | c | ad

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Produoes vazias a a c

Exerc cios: 1- S A B 2E D O C N

ABS | ASB | c AA | a | ABA | b | id D | C O E | +|*|-|/ N | N.N | 0 | 1 | . . . | 9 |

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a


Parsers LL que no utilizam backtracking so chamados de a a descendentes preditivos. Existem dois tipos:
Recursivo No-recursivo ou tabular a

Para que um parser seja preditivo necessrio que a e a gramtica esteja fatorada ` esquerda. O parser preditivo est a a a baseado nos primeiros terminais que podem ser gerados numa derivao. Este conjunto de terminais chamado de conjunto ca e First.
Denio do First: ca Dadas as produes A B1 |C 2 |D3 |...|Z n |a1 |b2 | co c3 |...|zm onde 1 , 2 , 3 , . . . , n , 1 , 2 , 3 , . . . , m (N T ) , e A, B, C , . . . , Z N e a, b, c, . . . , z T , ento a First(A) = First(B1 ) + First(C 2 ) + First(D3 ) + . . . , First(Z n ) + a + b + c + + z.
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a


Para gramticas fatoradas First(B1 ) = First(C 2 ) = a First(D3 ) = . . . , First(Z n ) = a = b = c = = z. Algoritmo de First
Entrada: = X (N T ) Saida : First() Se X terminal ento First() = {X } e a Se X no terminal e existe produo X ( = vazio) a e ca ento inclui e First() em First(). a Se X no terminal e existe produo X ( (N T )) a e ca ento inclui First()emFirst() a Se X no terminal e existe produo a e ca X ( Ne (N T ) )e ento inclui a First()emFirst().

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a


Exerc cios: Dadas as gramticas abaixo, fatore-as, se a necessrio, e ache o First de todos os no terminais. a a 1- A Ac | Aad | bd | 234A E Decl Lista id Tipo Simples Agregado Dimenso a Ab | Abe | Abed | a | e E + E | E * E | (E) | -E | id Lista id : Tipo id | Lista id , id Simples | Agregado int | real nat Dimenso Simples | conj Simples a ... (id, id)

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a


Exerc cios (continuao): ca 5B L C R E T Z S F bLe CR i - E | L | TZ FS + T R | * F S | n | i | (E)

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a recursivo


Parser descendente preditivo recursivo
E um parser descendente preditivo que usa informaes dadas co pelos conjuntos First dos no-terminais para prever qual a produo deve ser usada. No pode ser recursivo ` esquerda. ca a a O parser descendente recursivo implementa um automato de pilha de forma implicita, nesta implementao (programa), ca cada noterminal corresponde a uma funo. Dentro de cada a ca funo os terminais das produes so vericados e os ca co a no-terminais so chamados como funes. a a co Ex: S AbC First(S) = First(A) = {a} A ab First(A) = {a} C c First(C) = {c}
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a recursivo

Assumindo que a funo yylex retorna: ca


TK-A para o simbolo a TK-B para o simbolo b TK-C para o simbolo c

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. recursivo a a


int token; error() { printf(sentena no pertence a c a linguagem\n); } verica( int tok) { if (token == tok) { token = yylex(); } else error(); } C(){ if (token == TK C) verica(TK C); } else error(); }
Jos Carlos Bins Filho e Compiladores

A(){ if (token == TK A) { verica(TK A); verica(TK B); } else error(); } S() { if (token == TK A) { A(); verica(TK B); C(); } else error(); }

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a recursivo

main() { token = yylex(); S(); }

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a recursivo


Exerc cios: Implemente (usando o lex) os parsers descendente preditivos recursivos para as linguagens representadas pelas gramticas abaixo. a 1S A B S A C A|B aS b Ab | C a | d

2-

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a recursivo


Trabalho 2: Implemente (usando o lex) o parser descendente preditivo recursivo para a linguagem representada pela gramtica abaixo (entrega 20/04) a BLOCO LCMD RC CMD EXP T F RT RF
Compiladores

begin LCMD end CMD RC ; LCMD | id := EXP | T RT F RF num | id | (E) + T RT | - T RT | * F RF | / T RT |

id = identicador (deve comear por c letra; pode ter letras e nmeros e u sublinha; no pode ter 2 sublinhas a seguidos) num = nmero (pode ser inteiro ou u ponto-utuante; pode ter sinal; se ponto utuante deve ter pelo menos uma casa depois da virgula)

Jos Carlos Bins Filho e

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser descendente preditivo a a no recursivo a


Parser descendente preditivo no recursivo a
O parser descendente no recursivo implementa um automato a de pilha de forma explicitamente. O Parser simula uma derivao mais ` esquerda. ca a Para implementar o parser preditivo no recursivo necessrio a e a a criao de um conjunto de s ca mbolos chamado de Follow. O conjunto Follow identica todos os tokens que podem aparecer aps um no-terminal. o a
Ex: Na gramtica abaixo, e derivando a partir do s a mbolo inicial, quais simbolos podem seguir o A ? S ABC | C A B | a | B b | d | C e
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. o no a a a rec.


S S S ABC AbC ABC AdC ABC AC Ae : b segue A : d segue A : e segue A

Portanto o Follow(A) = {b,d,e} Algoritmo do Follow: Entrada: X N Saida : Follow(X)


Se X o s e mbolo inicial ento incluir $ no Follow(X) a Para a produo A X , onde e (N T ) , incluir ca First() {} no Follow(X) Para produes A X e A X , onde (N T ) , co N e , incluir Follow(A) no Follow(X)
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a


Exerc cios:Calcule o Follow dos no-terminais das gramticas a a abaixo 1- S ASB | C | c A B | a | B b | C cBAC | 2P D BL ST EXP T D BL T id ; D | { ST } id = EXP ; ST | const | id int | char | long

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a

Exerc cios: (continuao) ca 3- BLOCO begin LCMD end LCMD CMD RC RC ; LCMD | CMD id := EXP | EXP T RT T F RF F num | id | (E) RT + T RT | - T RT | RF * F RF | / T RT |

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a


Algoritmo de criao da tabela do Parser: ca Entrada: Gramtica a Sa da: Tabela do parser (M) Para cada produo A da gramtica ca a Para cada terminal a = First() Inclua A em M[A, a] Se First() Para cada terminal b Follow(A) Inclua A em M[A, b] Se $ Follow(A) Inclua A em M[A, $]

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a

Exerc cio: E TE1 E1 + TE1 | T FT1 T1 FT1 | F (E )|id

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a


Exerc cio: (continuao) ca First e Follow # 1 2 3 4 5 6 7 8
Jos Carlos Bins Filho e Compiladores

X E E1 E1 T T1 T1 F F

TE1 +TE1 FT1 *FT1 (E ) id

First(X) {(,id} {+,} {(,id} {*, } {(,id}

First() {(, id} {+} {} {(,id} {*} {} {(} {id}

Follow(X) {$,)} {$,)} {+,$,)} {+,$,)} {*,+,$,)}

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a


Exerc cio: (continuao) ca Montagem da tabela
+ E E1 T T1 F E1 +TE1 T FT1 T1 T1 *FT1 F (E ) T1 F id * ( E TE1 ) E1 T FT1 T1 id E TE1 $ E1

+ E E1 T T1 F
Jos Carlos Bins Filho e Compiladores

( 1 4

) 3

id 1 4

$ 3 6

2 6 5 7

6 8

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a

Algoritmo do Parser preditivo no recursivo: a Entrada: Uma sentena w e a tabela do parser M c Sa da: Se w L(G) resulta em erro / Inicializao: ca
Inserir $ no m de w cando a entrada w$ Colocar $S, onde S o s e mbolo inicial, na pilha Fazer ip, apontador de entrada, apontar para o primeiro s mbolo da entrada

Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a


Repita enquanto X = $ X topo a s mbolo apontado por ip Se X (T {$}) { Se X = a { Retira X da pilha Avana ip c } seno erro() a } seno Se M[X,a] = X Y1 , Y2 , . . . , Yn { a Retira X da pilha Coloca a produo na pilha em ordem invertida ca (Y1 no topo) } seno erro() a
Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a


Exerc cio: Mostre o teste de mesa para o parser descendente preditivo no recursivo para a tabela da gramtica do a a exerc anterior para a sentena id + id * (id + id) cio c w (id (id (id (id (id (id (id (id ip id id id id + + + id X E T F id T1 E1 + a id id id id + + + Pilha $E $E1 T $E1 T1 F $E1 T1 id $E1 T1 $E1 $E1 T + $E1 T topo E T F id T1 E1 + T

t0 t1 t2 t3 t4 t5 t6 t7
Jos Carlos Bins Filho e Compiladores

id id id id id id id id

+ id + id + id + id + id + id + id + id

+ id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a


t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 t20
Compiladores

id id id id id id id id id id id id id id

+ id + id + id + id + id + id + id + id + id + id + id + id + id + id

w (id (id (id (id (id (id (id (id (id (id (id (id (id (id

+ id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$

ip id id id * * ( ( id id id id + + +

X + T F id T1 T1 F ( E T F id T1 E1

a + id id id * * ( ( id id id id + +

Pilha $E1 T $E1 T1 F $E1 T1 id $E1 T1 $E1 T1 F $E1 T1 F $E1 T1 )E ( $E1 T1 )E $E1 T1 )E1 T $E1 T1 )E1 T1 F $E1 T1 )E1 T1 id $E1 T1 )E1 T1 $E1 T1 )E1 $E1 T1 )E1 T +

topo T F id T1 * F ( E T F id T1 E1 +

Jos Carlos Bins Filho e

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a


t20 t21 t22 t23 t24 t25 t26 t27 t28 t29 t30 id id id id id id id id id id id + id + id + id + id + id + id + id + id + id + id + id w (id (id (id (id (id (id (id (id (id (id (id + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ + id)$ ip + id id id ) ) ) $ $ $ $ X E1 + T F id T1 E1 ) T1 E1 $ a + + id id id ) ) ) $ $ $ Pilha $E1 T1 )E1 T + $E1 T1 )E1 T $E1 T1 )E1 T1 F $E1 T1 )E1 T1 id $E1 T1 )E1 T1 $E1 T1 )E1 $E1 T1 ) $E1 T1 $E1 $ topo + T F id T1 E1 ) T1 E1 $

Como o algoritmo encerrou sem dar erro a sentena w c pertence a linguagem


Jos Carlos Bins Filho e Compiladores

Apresentao Introduo Reviso de Linguagens formais Anlise Lxica Lex Anlise Sinttica: Introduo Anlise Sinttica: Pa ca ca a a e a a ca a a

Anlise sinttica descendente: Parser desc. pred. no rec. a a a

Exerc cio: Dada a gramtica abaixo, monte a tabela do parser a descendente preditivo no recursivo e de o teste de mesa para a a sentena i b t a e b c S S1 E iEtSS1 |a eS| b

Jos Carlos Bins Filho e Compiladores

You might also like