como construir um compilador utilizando ferramentas java€¦ · afnd facilita a descrição da...

42
Como construir um compilador utilizando ferramentas Java Aula 4 – Análise Léxica Prof. M ´ arcio Delamaro [email protected] Como construir um compilador utilizando ferramentas Java – p. 1/2

Upload: others

Post on 27-Jun-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 2: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 3: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 4: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 5: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 6: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 7: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 8: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 9: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 10: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

Execução do AL

Cadeia longa de símbolos.

Como construir um compilador utilizando ferramentas Java – p. 9/20

Page 11: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 12: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 13: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 14: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 15: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 16: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 17: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 18: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 19: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 20: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 21: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 22: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 23: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 24: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 25: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 26: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 27: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 28: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 29: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

Observações

AFND facilita a descrição da linguagem reconhecidapelo analisador léxico.

Como construir um compilador utilizando ferramentas Java – p. 17/20

Page 30: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 31: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 32: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 33: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

Expressões regulares

Usa operadores para combinar as letras do alfabeto eformar linguagens.

Como construir um compilador utilizando ferramentas Java – p. 18/20

Page 34: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 35: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 36: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 37: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 38: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 39: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 40: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 41: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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

Page 42: Como construir um compilador utilizando ferramentas Java€¦ · AFND facilita a descrição da linguagem reconhecida pelo analisador léxico. Por outro lado é difícil de implementar

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