Análises léxica e sintática

38
Análises léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Mauro La-Salette C. L. de Araújo Centro de Informática – CIn Universidade Federal de Pernambuco – UFPE [email protected]

description

Análises léxica e sintática. Teoria e Implementação de Linguagens Computacionais - IF688 Mauro La-Salette C. L. de Araújo Centro de Informática – CIn Universidade Federal de Pernambuco – UFPE [email protected]. Roteiro. Visão geral Análise léxica Definição Especificação Implementação - PowerPoint PPT Presentation

Transcript of Análises léxica e sintática

Page 1: Análises léxica e sintática

Análises léxica e sintática Teoria e Implementação de Linguagens

Computacionais - IF688

Mauro La-Salette C. L. de AraújoCentro de Informática – CIn

Universidade Federal de Pernambuco – UFPE

[email protected]

Page 2: Análises léxica e sintática

Roteiro Visão geral Análise léxica

Definição Especificação Implementação Correspondência

Análise sintática Definição Especificação Implementação

Algoritmos de parsing e gramáticas Gramáticas ambíguas Sintaxe abstrata

Page 3: Análises léxica e sintática

executável

Visão Geral

Análise sintática

Código fonte

AST

Análise semântica

Geração decódigo

AST decorada

Análiseléxica

Tokens

Page 4: Análises léxica e sintática

Análise Léxica

Page 5: Análises léxica e sintática

Definição Fase da compilação responsável por

extrair os tokens do código fonte de um programa.

if (n == 0) { return 1;} else { ...} RPAR LCUR

RCUR

if LPAR

return

else

"n"id

"0"intLit

assign

"1"intLit ...comm

Page 6: Análises léxica e sintática

EspecificaçãoOs tokens de uma linguagem

comumente são especificados através de Expressões Regulares

[a-z][a-z0-9]* identifier

[0-9]+ intLiteral

Page 7: Análises léxica e sintática

Implementação Autômatos finitos

1 2

a-z a-z

0-9

ID

21 3

i fIF

Page 8: Análises léxica e sintática

Análise Sintática

Page 9: Análises léxica e sintática

Definição Fase da compilação responsável por

determinar se uma dada cadeia de entrada pertence ou não à linguagem definida por uma gramática

Tem como entrada os tokens processados pela análise léxica

Produz uma estrutura comumente denominada AST – abstract syntax tree

Page 10: Análises léxica e sintática

Especificação

BNF - Backus-Naur form S, A, B, C, D : não-terminais

a,b,d: terminais

S ::= A | BA ::= C | DB ::= bbaC ::= abD ::= dab

Produções

Page 11: Análises léxica e sintática

ImplementaçãoAlgoritmos de parsing e gramáticas

ClassificaçãoTop-down

• Recursive-descent / LL(1)

Bottom-up

• LR, SLR, LALR, LR(k)

Page 12: Análises léxica e sintática

Recursive descent

Algoritmo baseado em previsões

Funções mutuamente recursivas

Uma função para cada não-terminal

Uma cláusula para cada produção

Page 13: Análises léxica e sintática

Recursive descent

Desenvolvendo um recursive descent parser

Cada não terminal 'X' dará origem a um método/função parseX();

Produções do tipo 'A | B' darão origem a cláusulas cases

Page 14: Análises léxica e sintática

Recursive descent

A ::= aBcC

B ::= CB | cC

C ::= da

parseA() { accept(‘a’); parseB(); accept(‘c’); parseC();}

parseB() { case (d): parseC(); parseB(); case (c): accept(‘c’); parseC();}

parseC() { accept(‘d’); accept(‘a’); }

Page 15: Análises léxica e sintática

Recursive descent Na prática constrói uma tabela de

produções indexadas por não-terminais e terminais

A ::= aBcC

B ::= CB | cC

C ::= da

a c d

A A::= aBcC

B B::= cC B::= CB

C C::= da

Page 16: Análises léxica e sintática

Recursive descent

A ::= aBcC

B ::= CB | CA

C ::= da

parseA() { accept(‘a’); parseB(); accept(‘c’); parseC();}

parseB() { case (d): parseC(); parseB(); case (d): parseC(); parseA();}

parseC() { accept(‘d’); accept(‘a’);}

Page 17: Análises léxica e sintática

Recursive descent Na prática constrói uma tabela de

produções indexadas por não-terminais e terminais

A ::= aBcC

B ::= CB | CA

C ::= da

a c d

A A::= aBC

B B::= CBB::= CA

C C::= da

Page 18: Análises léxica e sintática

Recursive descent

Vantagens Fácil de implementar

Desvantagens Performance Gramática reconhecida possui restrições

Sem recursão à esquerdaDeve estar fatorada ...

Page 19: Análises léxica e sintática

Recursive descent

A ::= aBC

B ::= CB | CA

C ::= da

A ::= aBC

B ::= CX

X ::= B | A

C ::= da

a c dA A::= aBCB B::= CXC C::= daX X::=A X::=B

GramáticaLL(1)

Page 20: Análises léxica e sintática

Gramáticas LL(1)

Left-to-right parse Leftmost-derivation 1-symbol-lookahead

Page 21: Análises léxica e sintática

Algoritmos bottom-up

Algoritmos LL(k) precisam decidir que produção usar tendo visto apenas k tokens da entrada

Algoritmos bottom-up são baseados em técnicas LR(k) Left-to-right parse, Right-most derivation,

k-symbol-lookahead

Page 22: Análises léxica e sintática

Algoritmos bottom-up

Baseados no conceito de autômato a pilha Pilha + lookahead Duas tipos de ações

Shift: • Coloca o primeiro token da entrada no topo da

pilhaReduce:

• Escolhe a regra X::= A B C • Retira C, B, A da pilha• Coloca X na pilha

Page 23: Análises léxica e sintática

Gramáticas LR LR(0)

Olham apenas para a pilha SLR

Melhoramento sobre o LR(0) LR(1)

Lookahead de 1 símbolo Consegue descrever a maioria das linguagens de

programação LALR(1)

Melhoramento sobre o LR(1) Diminuí o tamanho da tabela de parsing

Page 24: Análises léxica e sintática

Gramáticas Ambíguas Uma gramática é ambígua se a partir dela

uma sentença pode dar origem a duas arvores de parsing

Problemáticas para a compilação

Eliminação de ambigüidade é quase sempre possível Transformações na gramática

Page 25: Análises léxica e sintática

Gramáticas Ambíguas Caso clássico: gramática para expressões

aritméticas

E ::= intLiteral | E '*' E | E '/' E | E '+' E | E '-' E |'(' E ')'

Page 26: Análises léxica e sintática

Gramáticas Ambíguas

1 + 2 * 3

E

E E

E E

*

+ 3

21

E

E E

EE

+

*1

2 3

Page 27: Análises léxica e sintática

Gramáticas Ambíguas Solução:

Transformar a gramática * e / com maior precedência que + ou - Operadores associativos a esquerda

E ::= intLiteral | E '*' E | E '/' E | E '+' E | E '-' E |'(' E ')'

E ::= E '+' T | E '–' T | TT ::= T '*' F | T '/' F | FF ::= intLiteral |'(' E ')'

Page 28: Análises léxica e sintática

Parsing LR de Gramáticas Ambíguas

Gramáticas ambíguas ocasionam conflitos em parsers LR Shift-reduce conflict

O parser não consegue decidir se empilha o próximo símbolo da entrada, ou se reduz para uma regra já disponível

Reduce-reduce conflictO parser pode realizar uma redução para duas

regras distintas

Page 29: Análises léxica e sintática

Parsing LR de Gramáticas Ambíguas Caso clássico: dangling-else

S ::= 'if' E 'then' S 'else' SS ::= 'if' E 'then' SS ::= ...

Page 30: Análises léxica e sintática

Parsing LR de Gramáticas Ambíguas

if a then if b then s1 else s2

if a then { if b then s1 else s2 }

if a then { if b then s1 } else s2

?

Page 31: Análises léxica e sintática

Parsing LR de Gramáticas Ambíguas

if a then if b then s1 else s2Input:

Stack:

if a then if b then s1

reduce St ?shift else ?

St

Optando pelo reduce...

else s2

Page 32: Análises léxica e sintática

Parsing LR de Gramáticas Ambíguas

if a then if b then s1 else s2Input:

Stack:

if a then if b then s1

reduce St ?shift else ?

else s2

Optando pelo shift...

St

Page 33: Análises léxica e sintática

Parsing LR de Gramáticas Ambíguas Solução:

Transformar a gramática Introdução dos conceitos de matched e unmatched

S ::= 'if' E 'then' S 'else' SS ::= 'if' E 'then' SS ::= ...

S ::= M | U

M ::= 'if' E 'then' M 'else' M | ...

U ::= 'if' E 'then' S | 'if' E 'then' M 'else' U

Page 34: Análises léxica e sintática

LR(0)LL(0)

SLR

LALR(1)

LL(k)

LL(1)

Gramáticas não-ambíguas Gramáticas ambíguas

LR(1)

LR(k)

Page 35: Análises léxica e sintática

Sintaxe abstrata Apenas reconhecer se uma sentença

pertence ou não a linguagem especificada por uma gramática não é o suficiente

É necessário produzir uma estrutura que sirva de base para a próxima fase do processo de compilação Parse trees nunca são montadas na prática

Page 36: Análises léxica e sintática

AST – Abstract Syntax Tree Capturam a essência da estrutura de uma

gramática abstraindo não-terminais

Representação possível 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

Page 37: Análises léxica e sintática

AST – Abstract Syntax Tree

IfThenElse ::= 'if' expr 'then' comm1 'else' comm2

return new IfThenElse(expr, comm1, comm2);

IfThenElseexpr : Expressioncomm1 : Commandcomm2 : Command

Page 38: Análises léxica e sintática

Análises léxica e sintática Teoria e Implementação de Linguagens

Computacionais - IF688

Mauro La-Salette C. L. de AraújoCentro de Informática – CIn

Universidade Federal de Pernambuco – UFPE

[email protected]