Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J....

24
Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br

Transcript of Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J....

Page 1: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Análise léxica e sintáticaTeoria e Implementação de Linguagens Computacionais - IF688

Allan J. Souza{ajss}@cin.ufpe.br

Page 2: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

RoteiroProcesso de compilaçãoAnálise léxica

◦Reconhecimento de tokensAnálise sintáticaGramáticasRepresentações de um programa

Page 3: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Processo de compilação

beginif x = 5 then...

Código Fonte Compilador

1100111 0011100011

Programa

outputinput

Page 4: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Fases da compilaçãoab

stra

ção

implem

entação

Código fonte

tokens e lexemas

Árvoresintáticaabstrata

CódigoMáquina

AST decorada

Análise Léxica

Análise Sintática

Análise Semântica

Geração de Código

Page 5: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

ANÁLISE LÉXICA

Page 6: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Análise Léxica

Responsável por traduzir o arquivo fonte

em lexemas e tokens.

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

RCUR

if LPAR

return

else

"n"id

"0"intLit

equals

"1"intLit ...comm

Page 7: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Reconhecendo tokens Expressões regulares

if IF [a-z][a-z0-9]* ID[0-9]+ NUM

1 2

a-z a-z

0-9

ID

21 3

i fIF

Page 8: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

ANÁLISE SINTÁTICA

Page 9: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Análise Sintática “the way in wich words are put

together to form phrases, clauses or sentences.”

Webster´s DictionaryA seguinte construção é válida?int y = 0,k = 0;int x = y+++k;

Responsável por verificar quando uma sentença faz parte da gramática da linguagem.

Page 10: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

GRAMÁTICAS

Page 11: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Descrevendo linguagens

Gramáticas livres de contexto são utilizadas para descrever linguagens de programação◦Símbolo inicial◦Produções◦Símbolos terminais◦Símbolos não-terminais

Page 12: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Exemplo

E → E + E | TT → T * T | FF → ( E ) | a

Simbolo inicial: E→ é utilizado na

notação de produção

Terminais: + * ( ) a

Não terminais: E T FA cadeia a + (a + a * a) pertence à

gramática?

Page 13: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Derivações

EE + ET + EF + Ea + Ea + Ta + Fa + ( E )a + ( E + E )

a + ( T + E )a + ( F + E )a + ( a + E )a + ( a + T )a + ( a + T * T )a + ( a + F * T )a + ( a + a * T )a + ( a + a * F )a + ( a + a * a )

Determinar se uma cadeia pertence à gramática

Page 14: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Parse treeA Parse Tree é

construída conectando cada derivação a sua origem.

Na prática não é implementada pelos compiladores.

E

E

+

E

T

F

a

T

F

(

E

)

T

*

T

T

F

a

F

aa +

EE

Page 15: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Gramáticas ambíguas

a + a + a

E

E

+

E

T

F

a a a+

E E

T

F

T

F

E

a a+

E E

T

F

T

F

E

T

F

a+

E

Page 16: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Refatoração

E → E + E | FF → ( E ) | a

E → E + A | FA → EF → ( E ) | a

E

a a+

EA

F

E

F

A

F

a+

E

E

Page 17: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Gramáticas LL(1)a cadeia de entrada é examinada da esquerda

para a direitao analisador procura construir uma derivação

esquerdaexatamente 1 símbolo do resto da entrada é

examinado

LL(1)

Left-to-right

Leftmost-derivation

1-symbol lookahead

Page 18: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Recursão à esquerda

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

E → E + TE → 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´ →

Page 19: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Fatoração

E → F + F | FF → ( E ) | a

E → F + FE → F

E → F AA → + F | FF → ( E ) | a

não é possível decidir, olhando apenas o primeiro símbolo

Page 20: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

REPRESENTAÇÕES

Page 21: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Representação do programaApenas 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

Page 22: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Abstract Syntax Tree (AST)

IfThenElse

expr : Expressioncomm1 : Commandcomm2 : Command

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

return new IfThenElse(expr, comm1, comm2);

Page 23: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Abstract Syntax Tree (AST)

Page 24: Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza {ajss}@cin.ufpe.br.

Análise léxica e sintáticaTeoria e Implementação de Linguagens Computacionais - IF688

Allan J. Souza{ajss}@cin.ufpe.br