Professional Documents
Culture Documents
Compiladores
Jos Carlos Bins Filho e
14 de Abril de 2011
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
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
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 =
6.0
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.
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
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
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
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
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
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
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
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
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
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
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
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
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: 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.
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
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
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
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
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 )
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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.
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
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
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.
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
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
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
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
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
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.
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
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
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
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: 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
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 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
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
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
(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
(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
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
/ / / / / / / /
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}
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
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
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
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
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: Gramtica no fatorada a a S A aAc ab | a aAc aabc (erro / backtrack) aac (aceita sentena) c
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
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
3-
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
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
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
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
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
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
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
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
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
Exerc cios: 1- S A 2E T F
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
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
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
Exerc cios: 1- S A B 2E D O C 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
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
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
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
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
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
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
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
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
2-
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
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)
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
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
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
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
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 |
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
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
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
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
X E E1 E1 T T1 T1 F F
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
+ 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
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
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
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
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
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
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 +
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
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
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