240 likes | 378 Views
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 .
E N D
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
beginifx = 5then... Processo de compilação input output 1100111 0011100011 Programa Código Fonte Compilador
Fases da compilação Código fonte Análise Léxica tokens e lexemas implementação abstração Árvoresintáticaabstrata Análise Sintática Análise Semântica AST decorada CódigoMáquina Geração de Código
"n" id intLit intLit "1" "0" Análise Léxica Responsável por traduzir o arquivo fonte em lexemas e tokens. if (n == 0) { return 1; } else { ... } if LPAR equals RPAR LCUR return comm RCUR else ...
IF i f 1 2 a-z a-z ID 2 3 1 0-9 Reconhecendo tokens • Expressões regulares ifIF [a-z][a-z0-9]* ID [0-9]+ NUM
Análise Sintática “theway in wichwords are puttogether to formphrases, clausesorsentences.” Webster´s Dictionary • A 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.
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
Exemplo E → E + E | T T → T * T | F F → ( E ) | a • Simbolo inicial: E • → é utilizado na notação de produção • Terminais: +*( )a • Não terminais: E T F A cadeia a + (a + a * a) pertence à gramática?
Derivações Determinar se uma cadeia pertence à gramática E E + E T + E F + E a + E a + T a + F a + ( 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 )
Parse tree E • A Parse Treeé construída conectando cada derivação a sua origem. • Na prática não é implementada pelos compiladores. E E T T F E F E E T T T F F a + ( a * a ) a +
Gramáticas ambíguas a + a + a E E E E E E T T E E E E T T T T F F F F F F + a a + a a a + a +
Refatoração E → E + E | F F → ( E ) | a E → E + A | F A → E F → ( E ) | a E A E A E E E F F F a + a a +
Gramáticas LL(1) • a cadeia de entrada é examinada da esquerda para a direita • o analisador procura construir uma derivação esquerda • exatamente 1 símbolo do resto da entrada é examinado LL(1) Left-to-right Leftmost-derivation 1-symbollookahead
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´→
Fatoração E → F + F | F F → ( E ) | a E → F + F E → F E → F A A → + F | F F → ( E ) | a não é possível decidir, olhando apenas o primeiro símbolo
Representação do programa • 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
Abstract SyntaxTree (AST) IfThenElse ::= 'if' expr 'then' comm1 'else' comm2 return new IfThenElse(expr, comm1, comm2);
Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza{ajss}@cin.ufpe.br