Anlise lxica e sinttica Teoria e Implementao de

  • Slides: 24
Download presentation
Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF 688 Allan

Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF 688 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

Roteiro �Processo de compilação �Análise léxica ◦ Reconhecimento de tokens �Análise sintática �Gramáticas �Representações de um programa

Processo de compilação begin if x = 5 then. . . input Código Fonte

Processo de compilação begin if x = 5 then. . . input Código Fonte output Compilador 110011100011 Programa

Fases da compilação Código fonte Análise Léxica abstração Análise Sintática Árvore sintática abstrata Análise

Fases da compilação Código fonte Análise Léxica abstração Análise Sintática Árvore sintática abstrata Análise Semântica AST decorada Geração de Código Máquina implementação tokens e lexemas

ANÁLISE LÉXICA

ANÁLISE LÉXICA

Análise Léxica Responsável por traduzir o arquivo fonte em lexemas e tokens. if (n

Análise Léxica Responsável por traduzir o arquivo fonte em lexemas e tokens. if (n == 0) { return 1; } else {. . . } if LPAR id "n" int. Lit "0" RPAR LCUR int. Lit "1" comm RCUR equals return else. . .

Reconhecendo tokens � Expressões regulares if [a-z][a-z 0 -9]* [0 -9]+ IF ID NUM

Reconhecendo tokens � Expressões regulares if [a-z][a-z 0 -9]* [0 -9]+ IF ID NUM a-z IF i 1 ID f 2 a-z 3 1 2 0 -9

ANÁLISE SINTÁTICA

ANÁLISE SINTÁTICA

Análise Sintática “the way in wich words are put together to form phrases, clauses

Análise Sintática “the way in wich words are put together to form phrases, clauses or sentences. ” 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.

GRAMÁTICAS

GRAMÁTICAS

Descrevendo linguagens � Gramáticas livres de contexto são utilizadas para descrever linguagens de programação

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 |

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 T F a a

Derivações Determinar se uma cadeia pertence à gramática E E T F a a a + + + + E E T F ( E ) ( E + E ) a a a a a + + + + + ( ( ( ( ( T F a a a a + + + + + E E E T T F a a a ) ) * * * T T T F a ) ) )

Parse tree E �A Parse Tree é construída conectando cada derivação a sua origem.

Parse tree E �A Parse Tree é construída conectando cada derivação a sua origem. E E T T F F E E �Na prática não é implementada pelos compiladores. E T T T F F a + ( a + a * a )

Gramáticas ambíguas a + a E E T F a + E F +

Gramáticas ambíguas a + a E E T F a + E F + a T E T T F a E F F + a

Refatoração E → E + E | F F → ( E ) |

Refatoração E → E + E | F F → ( E ) | a E → E + A | F A → E F → ( E ) | a E A E E F a A E E F F + a

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

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 -symbol lookahead

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´ →

Fatoração E → F + F | F F → ( E ) |

Fatoração E → F + F | F F → ( E ) | a E → F A A → + F | F F → ( E ) | a E → F + F E → F não é possível decidir, olhando apenas o primeiro símbolo

REPRESENTAÇÕES

REPRESENTAÇÕES

Representação do programa �Apenas reconhecer se uma sentença pertence ou não a linguagem especificada

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 Syntax Tree (AST) If. Then. Else : : = 'if' expr 'then' comm

Abstract Syntax Tree (AST) If. Then. Else : : = 'if' expr 'then' comm 1 'else' comm 2 return new If. Then. Else(expr, comm 1, comm 2);

Abstract Syntax Tree (AST)

Abstract Syntax Tree (AST)

Análise léxica e sintática Teoria e Implementação de Linguagens Computacionais - IF 688 Allan

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