como construir um compilador utilizando ferramentas java€¦ · afnd facilita a descrição da...
TRANSCRIPT
Como construir um compilador utilizandoferramentas Java
Aula 4 – Análise Léxica
Prof. Marcio [email protected]
Como construir um compilador utilizando ferramentas Java – p. 1/20
O que é
a tarefa do analisador léxico é quebrar a entrada emsímbolos que façam sentido para a definição dalinguagem e para o analisador sintático.
Para identificarmos quais são esses símbolos, bastaolharmos na definição da linguagem – sua gramática ougrafo sintático – e identificarmos quais são os seussímbolos terminais.
No contexto da análise léxica, costumamos chamaresses símbolos de tokens.
Como construir um compilador utilizando ferramentas Java – p. 2/20
Linguagens e alfabetos
Os símbolos terminais compõem o alfabeto sobre o quala nossa linguagem é definida.
Esse conjunto de símbolos pode ser definido como umalinguagem.
Muito mais simples que a linguagem alvo.
Modelos simples como AFD e ER.
Como construir um compilador utilizando ferramentas Java – p. 3/20
Autômato Finito Determinístico
Um autômato finito determinístico (AFD) é um modelo paradefinição de linguagens regulares composto de cincoelementos 〈Σ, S, s0, δ, F 〉, onde:
Σ é o alfabeto sobre o qual a linguagem é definida;
S é um conjunto finito não vazio de estados;
s0 é o estado inicial, s0 ∈ S;
δ é a função de transição de estados, δ : S × Σ → S;
F é o conjunto de estados finais, F ⊆ S.
Como construir um compilador utilizando ferramentas Java – p. 4/20
Máquina de reconhecer cadeias
Recebe como entrada uma cadeia e diz se ela pertence ounão à linguagem desejada.
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
�����������������������
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Aceita
Não
Aceita
a b a c d Estados
Finito de
Controle
cb
Como construir um compilador utilizando ferramentas Java – p. 5/20
Representações
δ 0 1 2 3 4 5 6 7 8 9
s0 s0 s1 s2 s0 s1 s2 s0 s1 s2 s0
s1 s1 s2 s0 s1 s2 s0 s1 s2 s0 s1
s2 s2 s0 s1 s2 s0 s1 s2 s0 s1 s2
Como construir um compilador utilizando ferramentas Java – p. 6/20
Representações
δ 0 1 2 3 4 5 6 7 8 9
s0 s0 s1 s2 s0 s1 s2 s0 s1 s2 s0
s1 s1 s2 s0 s1 s2 s0 s1 s2 s0 s1
s2 s2 s0 s1 s2 s0 s1 s2 s0 s1 s2
0 S1S
1,4,7
2S
0,3,6,9 0,3,6,9
2,5,8
0,3,6,9
2,5,8
2,5,8
1,4,71,4,7
Como construir um compilador utilizando ferramentas Java – p. 6/20
Tabela de transição
Uma das vantagens de se utilizar um AFD para definirquais são os tokens a serem reconhecidos pelo AL éque é fácil implementar um AL baseado na tabela detransição de estados.
Tal analisador deve apenas ler uma letra da entrada e,baseado na tabela, fazer a mudança de estado.
Se o estado em que o AFD se encontrar for um estadofinal, então a cadeia lida até aquele ponto é um tokenválido.
Como construir um compilador utilizando ferramentas Java – p. 7/20
AFD com função parcial
δ 0 1 2 3 4 5 6 7 8 9
s0 −− s1 s2 s0 s1 s2 s0 s1 s2 s0
s1 s1 s2 s0 s1 s2 s0 s1 s2 s0 s1
s2 s2 s0 s1 s2 s0 s1 s2 s0 s1 s2
0 S1S
1,4,7
2S
3,6,9 0,3,6,9
2,5,8
0,3,6,9
2,5,8
2,5,8
1,4,71,4,7
Como construir um compilador utilizando ferramentas Java – p. 8/20
Execução do AL
Cadeia longa de símbolos.
Como construir um compilador utilizando ferramentas Java – p. 9/20
Execução do AL
Cadeia longa de símbolos.
A cada execução do AFD (analisador léxico), umsímbolo é reconhecido.
Como construir um compilador utilizando ferramentas Java – p. 9/20
Execução do AL
Cadeia longa de símbolos.
A cada execução do AFD (analisador léxico), umsímbolo é reconhecido.
O AFD é executado até que não haja mais nenhumatransição possível
Como construir um compilador utilizando ferramentas Java – p. 9/20
Execução do AL
Cadeia longa de símbolos.
A cada execução do AFD (analisador léxico), umsímbolo é reconhecido.
O AFD é executado até que não haja mais nenhumatransição possível
Se o último estado for final, o símbolo é válido.
Como construir um compilador utilizando ferramentas Java – p. 9/20
Execução do AL
Cadeia longa de símbolos.
A cada execução do AFD (analisador léxico), umsímbolo é reconhecido.
O AFD é executado até que não haja mais nenhumatransição possível
Se o último estado for final, o símbolo é válido.
Se não, um erro ocorreu.
Como construir um compilador utilizando ferramentas Java – p. 9/20
Exemplo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
Como construir um compilador utilizando ferramentas Java – p. 10/20
Exemplo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
i⊔f⊔1234
Como construir um compilador utilizando ferramentas Java – p. 10/20
Exemplo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
i⊔f⊔1234
if⊔1234
Como construir um compilador utilizando ferramentas Java – p. 10/20
Exemplo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
i⊔f⊔1234
if⊔1234
if1234
Como construir um compilador utilizando ferramentas Java – p. 10/20
Exemplo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
i⊔f⊔1234
if⊔1234
if1234
1234if1234Como construir um compilador utilizando ferramentas Java – p. 10/20
Tipo de símbolo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
Associar a cada nó um tipo de token.
Como construir um compilador utilizando ferramentas Java – p. 11/20
Tipo de símbolo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
Associar a cada nó um tipo de token.
Se execução termina no estado 2, um número foireconhecido.
Como construir um compilador utilizando ferramentas Java – p. 11/20
Tipo de símbolo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
Associar a cada nó um tipo de token.
Se execução termina no estado 2, um número foireconhecido.
Se termina nos estados 3 ou 5, um identificador foireconhecido
Como construir um compilador utilizando ferramentas Java – p. 11/20
Tipo de símbolo
1
i f
letra - {i}
2
3 4
5
branco
letra, dígito
letra - {f}, dígito
dígito
dígito
letra, dígito
Associar a cada nó um tipo de token.
Se execução termina no estado 2, um número foireconhecido.
Se termina nos estados 3 ou 5, um identificador foireconhecido
Se termina no estado 4, um if foi reconhecido
Como construir um compilador utilizando ferramentas Java – p. 11/20
Tabela de transição
Estado Letra: próximo estado Tipo
1 branco:1 digito:2 i:3 letra-{i}:5 ERRO
2 digito:2 NÚMERO
3 f:4 letra:5 digito:5 IDENT
4 letra:5 digito:5 IF
5 letra:5 digito:5 IDENT
Ver programa 3.1 pag 43
Como construir um compilador utilizando ferramentas Java – p. 12/20
Complexidade de um AFD
Na linguagem X++, que é bastante simples, temos nadamenos que 39 símbolos terminais.
A construção do AFD pode se tornar bastante complexa.
Uma das maneiras de diminuir essa dificuldade éutilizando um autômato finito não determinístico (AFND)
Como construir um compilador utilizando ferramentas Java – p. 13/20
Autômato finito não determinístico
A função de transição de estados é definida δ : S × Σ →
conjunto de subconjuntos finitos de ρ(S)
Pode existir mais de uma transição saindo de um estadopara a mesma letra do alfabeto.
Como construir um compilador utilizando ferramentas Java – p. 14/20
Exemplo de autômato finito não determinístico
1
i f
2
3 4
5
letra
branco
letra, dígito
dígito
dígito
if12 {1}i→ {3, 5}
f→ {4, 5}
1→ {5}
2→ {5}
if {1}i→ {3, 5}
f→ {4, 5}
Como construir um compilador utilizando ferramentas Java – p. 15/20
AFND com estados vários iniciaisUm AFND pode também ter diversos estados iniciais
i f
1
letra
2
3 4 5
6 7
letra, dígito
dígitobranco dígito
branco
branco
if12 {1, 3, 6}i→ {4, 7}
f→ {5, 7}
1→ {7}
2→ {7}
if {1, 3, 6}i→ {4, 7}
f→ {5, 7}
Como construir um compilador utilizando ferramentas Java – p. 16/20
Observações
AFND facilita a descrição da linguagem reconhecidapelo analisador léxico.
Como construir um compilador utilizando ferramentas Java – p. 17/20
Observações
AFND facilita a descrição da linguagem reconhecidapelo analisador léxico.
Por outro lado é difícil de implementar.
Como construir um compilador utilizando ferramentas Java – p. 17/20
Observações
AFND facilita a descrição da linguagem reconhecidapelo analisador léxico.
Por outro lado é difícil de implementar.
Não adiciona nenhum poder extra aos AFDs
Como construir um compilador utilizando ferramentas Java – p. 17/20
Observações
AFND facilita a descrição da linguagem reconhecidapelo analisador léxico.
Por outro lado é difícil de implementar.
Não adiciona nenhum poder extra aos AFDs
Portanto podemos sempre transformar um AFND emum AFD.
Como construir um compilador utilizando ferramentas Java – p. 17/20
Expressões regulares
Usa operadores para combinar as letras do alfabeto eformar linguagens.
Como construir um compilador utilizando ferramentas Java – p. 18/20
Expressões regulares
Usa operadores para combinar as letras do alfabeto eformar linguagens.
União (∪): dadas as linguagens L1 e L2, sobre o alfabetoΣ, define-se L1 ∪ L2 como {x ∈ Σ∗ | x ∈ L1 ∨ x ∈ L2};
Como construir um compilador utilizando ferramentas Java – p. 18/20
Expressões regulares
Usa operadores para combinar as letras do alfabeto eformar linguagens.
União (∪): dadas as linguagens L1 e L2, sobre o alfabetoΣ, define-se L1 ∪ L2 como {x ∈ Σ∗ | x ∈ L1 ∨ x ∈ L2};
Concatenação (·): dadas as linguagens L1 e L2, sobre oalfabeto Σ, define-se L1 · L2 como{x.y ∈ Σ∗ | x ∈ L1 ∧ y ∈ L2};
Como construir um compilador utilizando ferramentas Java – p. 18/20
Expressões regulares
Usa operadores para combinar as letras do alfabeto eformar linguagens.
União (∪): dadas as linguagens L1 e L2, sobre o alfabetoΣ, define-se L1 ∪ L2 como {x ∈ Σ∗ | x ∈ L1 ∨ x ∈ L2};
Concatenação (·): dadas as linguagens L1 e L2, sobre oalfabeto Σ, define-se L1 · L2 como{x.y ∈ Σ∗ | x ∈ L1 ∧ y ∈ L2};
Fecho de Kleene (∗): dada a linguagem L sobre oalfabeto Σ, define-se L∗ como sendoλ ∪ L ∪ (L · L) ∪ (L · L · L) ∪ (L · L · L · L) ∪ ....
Como construir um compilador utilizando ferramentas Java – p. 18/20
ER e o analisador léxico
Cada item léxico pode ser definido através de uma ER.
Como construir um compilador utilizando ferramentas Java – p. 19/20
ER e o analisador léxico
Cada item léxico pode ser definido através de uma ER.
NUMERO: digito · digito∗;
Como construir um compilador utilizando ferramentas Java – p. 19/20
ER e o analisador léxico
Cada item léxico pode ser definido através de uma ER.
NUMERO: digito · digito∗;
IF: i · f ;
Como construir um compilador utilizando ferramentas Java – p. 19/20
ER e o analisador léxico
Cada item léxico pode ser definido através de uma ER.
NUMERO: digito · digito∗;
IF: i · f ;
IDENTIFICADOR: letra · (letra ∪ digito)∗.
Como construir um compilador utilizando ferramentas Java – p. 19/20
ER e o analisador léxico
Cada item léxico pode ser definido através de uma ER.
NUMERO: digito · digito∗;
IF: i · f ;
IDENTIFICADOR: letra · (letra ∪ digito)∗.
Uma (ou diversas) ER pode ser transformada em umAFND.
Como construir um compilador utilizando ferramentas Java – p. 19/20
Exercício
1) Identifique cada símbolo terminal na gramática de X++econstrua, para cada um uma ER e um AFND.2) Baixe o JavaCC (https://javacc.dev.java.net) e sua doc.(https://javacc.dev.java.net/doc/docindex.html) e tenteentender como funciona este gerador de compiladores, queserá usado para construir nosso analisador léxico. Vejatambém o Apêndice B do livro.
Como construir um compilador utilizando ferramentas Java – p. 20/20