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

Post on 27-Jun-2020

1 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Como construir um compilador utilizandoferramentas Java

Aula 4 – Análise Léxica

Prof. Marcio Delamarodelamaro@icmc.usp.br

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

top related