Upload
tevin
View
77
Download
0
Embed Size (px)
DESCRIPTION
Análise léxica e sintática. Teoria e Implementação de Linguagens Computacionais - IF688. Allan J. Souza { ajss }@ cin.ufpe.br. Roteiro. Processo de compilação Análise léxica Reconhecimento de tokens Análise sintática Gramáticas Representações de um programa. begin if x = 5 then . - PowerPoint PPT Presentation
Citation preview
Análise léxica e sintáticaTeoria 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
Processo de compilação
beginif x = 5 then...
Código Fonte Compilador
1100111 0011100011
Programa
outputinput
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áticaAnálise Semântica
Geração de Código
ANÁLISE LÉXICA
Análise LéxicaResponsável por traduzir o arquivo
fonteem lexemas e tokens.
if (n == 0) { return 1;} else { ...} RPAR LCUR
RCUR
if LPAR
return
else
"n"id
"0"intLit
equals
"1"intLit ...comm
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
ANÁLISE SINTÁTICA
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.
GRAMÁTICAS
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
ExemploE → 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?
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
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
Gramáticas ambíguasa + 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
RefatoraçãoE → E + E | FF → ( E ) | a
E → E + A | FA → EF → ( E ) | a
E
a a+
E A
F
E
F
A
F
a+
E
E
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
Recursão à esquerdaGramá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´ →
FatoraçãoE → 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
REPRESENTAÇÕES
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
Abstract Syntax Tree (AST)
IfThenElseexpr : Expressioncomm1 : Commandcomm2 : Command
IfThenElse ::= 'if' expr 'then' comm1 'else' comm2
return new IfThenElse(expr, comm1, comm2);
Abstract Syntax Tree (AST)
Análise léxica e sintáticaTeoria e Implementação de Linguagens Computacionais - IF688
Allan J. Souza{ajss}@cin.ufpe.br