Anlise Lxica e Sinttica Teoria e Implementao de

  • Slides: 41
Download presentation
Análise Léxica e Sintática Teoria e Implementação de Linguagens Computacionais - IF 688 –

Análise Léxica e Sintática Teoria e Implementação de Linguagens Computacionais - IF 688 – 2007. 1 Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Roteiro n n n n Fases da compilação Analise Lexica Tokens, lexemas, expressões regulares

Roteiro n n n n Fases da compilação Analise Lexica Tokens, lexemas, expressões regulares e autômatos finitos Analise Sintática Gramáticas e parsers Parser trees Derivações Gramáticas ambíguas n n n n n Ambigüidade aritméticas Parser recursive descendent Recursão à esquerda Gramáticas LL(k) Gramáticas LR(k) Outras gramáticas Dangling else Parsing LR de gramáticas ambíguas AST Referências Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Atenção! Este material não substitui a leitura da bibliografia n Sugerimos pesquisar a leitura

Atenção! Este material não substitui a leitura da bibliografia n Sugerimos pesquisar a leitura referenciada no final deste trabalho e no site da disciplina n Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Processo de Compilação begin if x = 5 then. . . output + params

Processo de Compilação begin if x = 5 then. . . output + params Código Fonte Compilador Luiz Carlos d´Oleron – lcadb@cin. ufpe. br 110011100011 Programa

Fases da compilação Análise Léxica tokens e lexemas Análise Sintática Árvore sintática abstrata Análise

Fases da compilação Análise Léxica tokens e lexemas Análise Sintática Árvore sintática abstrata Análise Semântica AST decorada Geração de Código Máquina Luiz Carlos d´Oleron – lcadb@cin. ufpe. br implementação abstração Código fonte

Background Acadêmico - CIn Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Background Acadêmico - CIn Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Análise Léxica O analisador léxico é responsável por traduzir o arquivo fonte em lexemas

Análise Léxica O analisador léxico é responsável por traduzir o arquivo fonte em lexemas e tokens if (n == 0) { return 1; } else {. . . } if LPAR id "n" assign int. Lit "0" RPAR LCUR return int. Lit "1" comm RCUR else Luiz Carlos d´Oleron – lcadb@cin. ufpe. br . . .

Reconhecendo tokens Expressões regulares (implementadas como Autômatos Finitos) são comumente utilizadas Exemplos: if [a-z][a-z

Reconhecendo tokens Expressões regulares (implementadas como Autômatos Finitos) são comumente utilizadas Exemplos: if [a-z][a-z 0 -9]* [0 -9]+ IF ID NUM Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Reconhecendo tokens ID a-z 1 a-z 2 0 -9 IF i 1 f 2

Reconhecendo tokens ID a-z 1 a-z 2 0 -9 IF i 1 f 2 Luiz Carlos d´Oleron – lcadb@cin. ufpe. br 3

Análise Sintática “syn-tax: the way in wich words are put together to form phrases,

Análise Sintática “syn-tax: the way in wich words are put together to form phrases, clauses or setences. ” Webster´s Dictionary A seguinte construção é válida? int y = 0, k = 0; int x = y+++k; Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Análise Sintática O Analisador Sintático é responsável por verificar quando uma sentença faz parte

Análise Sintática O Analisador Sintático é responsável por verificar quando uma sentença faz parte da gramática da linguagem. Entrada: lexemas e tokens gerados pelo analisador léxico Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Gramáticas – descrevendo linguagens Gramáticas livres de contexto são utilizadas para descrever linguagens de

Gramáticas – descrevendo linguagens Gramáticas livres de contexto são utilizadas para descrever linguagens de programação Produções n Símbolos terminais n Símbolos não-terminais n Símbolo inicial n Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Exemplo S→S; S S → id : = E S → print (L) E

Exemplo S→S; S S → id : = E S → print (L) E → id E → num E→E+E E → ( S , E) L→E L→L, E n n n Terminais: id print , + ; : = ( ) Não terminas: S E L Símbolo inicial: S → é utilizado na notação de produções A cadeia seguinte pertence à gramática? a : = 7; b : = c + (d : = 5 + 6, d) Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Derivações Para determinar se uma cadeia pertence à gramática pode ser utilizado o processo

Derivações Para determinar se uma cadeia pertence à gramática pode ser utilizado o processo de Derivação: S S ; id : = E ; id : = num id : = num id : = num E id : = E ; id : = ; id : = ; id : = E E + (S, E) id + (id : = id + (id : = E, E) E + E, id) num + num, id) Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parse tree S S id : = S E ; id num + E

Parse tree S S id : = S E ; id num + E A Parse Tree é construída conectando cada derivação a sua origem. Na prática não é implementada pelos compiladores. E : = E ( id id S : = E E + num Luiz Carlos d´Oleron – lcadb@cin. ufpe. br E , id E num )

Gramáticas ambíguas n Uma gramática é ambígua se a partir dela uma sentença pode

Gramáticas ambíguas n Uma gramática é ambígua se a partir dela uma sentença pode dar origem a duas arvores de parsing diferentes n Indeterminismo é problemático para a compilação n Eliminação de ambigüidade é quase sempre possível n Refatoração da gramática Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Gramáticas ambíguas x : = 1 + 2 + 3; S id S E

Gramáticas ambíguas x : = 1 + 2 + 3; S id S E : = E E num + + E num id E num E : = E num + E num Luiz Carlos d´Oleron – lcadb@cin. ufpe. br E + E num

Gramática refatorada S→S; S S → id : = E S → print (L)

Gramática refatorada S→S; S S → id : = E S → print (L) E → id E → num E→E+E E → ( S , E) L→E L→L, E S→S; S S → id : = E S → print (L) E → id E → num E→E+T E→T E → ( S , E) L→E L→L, E Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parsers Utilizados para avaliar uma entrada quanto à sintaxe n Podem ser n n

Parsers Utilizados para avaliar uma entrada quanto à sintaxe n Podem ser n n Top-down n Recursive-descent / LL(k) n Bottom-up n SRL, LR(k) Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parser Recursive descent Algoritmo baseado em previsões n Também conhecido como Predictive n Parsing

Parser Recursive descent Algoritmo baseado em previsões n Também conhecido como Predictive n Parsing Funções mutuamente recursivas n Simples implementação n Uma função para cada não-terminal n Uma cláusula para cada produção n Verifica o primeiro símbolo terminal para decidir qual função usar n Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parser Recursive descent n Desenvolvendo um recursive descent parser n Cada não terminal 'X'

Parser Recursive descent n Desenvolvendo um recursive descent parser n Cada não terminal 'X' dará origem a um método/função parse. X(); n Produções do tipo 'A | B' darão origem a cláusulas cases Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parser Recursive descent A : : = a. Bc. C parse. A() { accept(‘a’);

Parser Recursive descent A : : = a. Bc. C parse. A() { accept(‘a’); parse. B(); accept(‘c’); parse. C(); } parse. B() { case (d): parse. C(); parse. B(); case (c): accept(‘c’); parse. C(); } B : : = CB | c. C C : : = da parse. C() { accept(‘d’); accept(‘a’); } Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Recursive descent n Na prática constrói uma tabela de produções indexadas por não-terminais e

Recursive descent n Na prática constrói uma tabela de produções indexadas por não-terminais e terminais a A A : : = a. Bc. C c d A: : = a. Bc. C B B: : = CA C C: : = da B : : = CB | CA C : : = da Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Recursive descent n Vantagens Fácil de implementar n Fácil de entender n n Desvantagens

Recursive descent n Vantagens Fácil de implementar n Fácil de entender n n Desvantagens Performance deficiente n Gramática reconhecida possui restrições n n Sem recursão à esquerda n Deve estar fatorada Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Recursive descent A : : = a. Bc. C B : : = CX

Recursive descent A : : = a. Bc. C B : : = CX B : : = CB | CA Gramática LL(1) X : : = B | A C : : = da a A c d A: : = a. Bc. C B B: : = CX C C: : = da X X: : =A X: : =B Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Gramáticas e Parsers LL(1) n n n n Gramáticas SEM entradas duplicadas na tabela

Gramáticas e Parsers LL(1) n n n n Gramáticas SEM entradas duplicadas na tabela são conhecidas como LL(1) - Left-to-right, leftmost-derivation, 1 symbol lookahead Left-to-right – direção na qual os símbolos serão examinados Leftmost-derivation – ordem pela qual os símbolos não-terminais serão expandidos 1 -symbol lookahead– não mais que um símbolo será avaliado por vez Existem LL(2), LL(3), . . . Toda LL(1) é LL(2), toda LL(2) é LL(3), . . . LL(k) Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

LL(1) na prática - Applet http: //ag-kastens. uni-paderborn. de/lehre/material/uebi/parsdemo/LL 1 Parser. html Luiz Carlos

LL(1) na prática - Applet http: //ag-kastens. uni-paderborn. de/lehre/material/uebi/parsdemo/LL 1 Parser. html Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Recursão à esquerda Gramáticas LL(1) são vulneráveis às entradas duplicadas. Por exemplo, o fragmento

Recursão à esquerda Gramáticas LL(1) são vulneráveis às entradas duplicadas. Por exemplo, o fragmento a seguir: E→E+T E→T O fato de E aparecer no início do lado direito da produção é a causa do problema. Isso é conhecido como Recursão à Esquerda. Para corrigir isso, vamos refatorar a gramática, com Recursão à Direita: E → T E´ E´ → +T E´ E´ → Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Gramáticas e Parsers LR(1) n n n As fraquezas de LL(k) são superadas pela

Gramáticas e Parsers LR(1) n n n As fraquezas de LL(k) são superadas pela técnica LR(k) LR(1) - Left-to-right, rightmostderivation, 1 -symbol lookahead Uso de uma pilha para armazenar símbolos de forma temporária Possui duas operações, shift e reduce shift: Move o primeiro símbolo para o topo da pilha reduce: escolhe uma regra da gramática do tipo X→A B C. push X da pilha e pop C B A. Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Outros Parsers LR n LR(0) n n SLR n n n Olham apenas para

Outros Parsers LR n LR(0) n n SLR n n n Olham apenas para a pilha Melhoramento sobre o LR(0) LR(1) n Lookahead de 1 símbolo n Consegue descrever a maioria das linguagens de programação LALR(1) n Melhoramento sobre o LR(1) n Diminuí o tamanho da tabela de parsing Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

shift-reduce na prática Applet http: //ag-kastens. uni-paderborn. de/lehre/material/uebi/parsdemo/SRParser. html Luiz Carlos d´Oleron – lcadb@cin.

shift-reduce na prática Applet http: //ag-kastens. uni-paderborn. de/lehre/material/uebi/parsdemo/SRParser. html Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parsing LR de Gramáticas Ambíguas n Gramáticas ambíguas ocasionam conflitos em parsers LR n

Parsing LR de Gramáticas Ambíguas n Gramáticas ambíguas ocasionam conflitos em parsers LR n Shift-reduce conflict parser não consegue decidir se empilha o próximo símbolo da entrada, ou se reduz n. O para uma regra já disponível n Reduce-reduce conflict n. O parser pode realizar uma redução para duas regras distintas Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parsing LR de Gramáticas Ambíguas n Caso clássico: dangling-else S : : = 'if'

Parsing LR de Gramáticas Ambíguas n Caso clássico: dangling-else S : : = 'if' E 'then' S 'else' S S : : = 'if' E 'then' S S : : =. . . Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parsing LR de Gramáticas Ambíguas if a then { if b then s 1

Parsing LR de Gramáticas Ambíguas if a then { if b then s 1 } else s 2 if a then if b then s 1 else s 2 ? if a then { if b then s 1 else s 2 } Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Parsing LR de Gramáticas Ambíguas n Solução: n Transformar a gramática n Introdução dos

Parsing LR de Gramáticas Ambíguas n Solução: n Transformar a gramática n Introdução dos conceitos de matched e unmatched S : : = 'if' E 'then' S 'else' S S : : = 'if' E 'then' S S : : =. . . S : : = M | U M : : = 'if' E 'then' M 'else' M |. . . U : : = 'if' E 'then' S | 'if' E 'then' M 'else' U Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Gramáticas não-ambíguas LL(k) LR(k) LL(1) LR(1) Gramáticas ambíguas LALR(1) SLR LL(0) LR(0) Luiz Carlos

Gramáticas não-ambíguas LL(k) LR(k) LL(1) LR(1) Gramáticas ambíguas LALR(1) SLR LL(0) LR(0) Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Sintaxe abstrata n Apenas reconhecer se uma sentença pertence ou não a linguagem especificada

Sintaxe abstrata n Apenas reconhecer se uma sentença pertence ou não a linguagem especificada por uma gramática não é o suficiente n É necessário produzir uma estrutura que sirva de base para a próxima fase do processo de compilação n Parse trees nunca são montadas na prática Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

AST – Abstract Syntax Tree n Capturam a essência da estrutura de uma gramática

AST – Abstract Syntax Tree n Capturam a essência da estrutura de uma gramática abstraindo não-terminais n Representação possível n n Java: Classes que possam se relacionar a fim de montar uma árvore Pode ser produzida através da inserção de ações semânticas no parser Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

AST – Abstract Syntax Tree If. Then. Else : : = 'if' expr 'then'

AST – Abstract Syntax Tree If. Then. Else : : = 'if' expr 'then' comm 1 'else' comm 2 return new If. Then. Else(expr, comm 1, comm 2); Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Luiz Carlos d´Oleron – lcadb@cin. ufpe. br

Referências n Análises léxica e sintática, Mauro La. Salette C. L. de Araújo n

Referências n Análises léxica e sintática, Mauro La. Salette C. L. de Araújo n Modern Compiler implementation in Java, Andrew W. Appel Luiz Carlos d´Oleron – lcadb@cin. ufpe. br