Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Análise léxica e sintática
Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza
2
Roteiro Processo de compilação Análise léxica Análise sintática
Reconhecimento de tokens Análise sintática Gramáticas Representações de um programa
3
Processo de compilação
Compilador begin if x = 5 then ... Código Fonte Programa input output
4
Árvore sintática abstrata
Fases da compilação Código fonte Análise Léxica tokens e lexemas implementação abstração Árvore sintática abstrata Análise Sintática Análise Semântica AST decorada Código Máquina Geração de Código
5
Análise Léxica
6
Análise Léxica Responsável por traduzir o arquivo fonte
em lexemas e tokens. if (n == 0) { return 1; } else { ... } if LPAR "n" id equals "0" intLit RPAR LCUR return "1" intLit comm RCUR else ...
7
Reconhecendo tokens Expressões regulares if IF [a-z][a-z0-9]* ID
[0-9] NUM 1 2 a-z 0-9 ID 2 1 3 i f IF
8
Análise sintática
9
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.
10
Gramáticas
11
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
12
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?
13
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 )
14
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 )
15
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
16
Refatoração E → E + E | F F → ( E ) | a
E → E + A | F A → E F → ( E ) | a E a + A F
17
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
18
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´ →
19
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
20
Representações
21
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
22
Abstract Syntax Tree (AST)
IfThenElse ::= 'if' expr 'then' comm1 'else' comm2 return new IfThenElse(expr, comm1, comm2);
23
Abstract Syntax Tree (AST)
24
Análise léxica e sintática
Teoria e Implementação de Linguagens Computacionais - IF688 Allan J. Souza
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.