compiladores - análise léxicabruno/uploads/lectures/compaula3.pdf · c lex com tiny arquivo de...

32
Instituto de C Compiladores An´ alise L´ exica Bruno Lopes Bruno Lopes Compiladores 1 / 31

Upload: others

Post on 22-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

CompiladoresAnalise Lexica

Bruno Lopes

Bruno Lopes Compiladores 1 / 31

Page 2: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Front-end

Lida com a linguagem de entrada

Teste de pertinencia: codigo fonte ∈ linguagem fonte?

Programa esta bem formado?

Sintaticamente?Semanticamente?

Cria um codigo intermediario

Bruno Lopes Compiladores 2 / 31

Page 3: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Front-end

AnalisadorLexico

AnalisadorSintatico

Gerador de CodigoIntermediario

Tabela de Sımbolos

Codigo Fonte TokenArvore deSintaxe

Codigode tresenderecos

Bruno Lopes Compiladores 3 / 31

Page 4: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Scanner

Construcao

Converter uma especificacao de linguagem em codigo.

1 Escrever expressao regular para representar a linguagem

2 Construir NFA para reconhecer a linguagem, a partir das ERs

3 Transformar NFA em DFA

4 Minimizar DFA

5 Transformar em codigo

Bruno Lopes Compiladores 4 / 31

Page 5: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Codigo simples

//estado 1

if (the next character is a letter)

advance the input;

// estado 2

while (the next character is a letter or digit)

// permanece no estado 2

advance the input

// vai para o estado 3, sem avancar a entrada

accept;

else

error;

Bruno Lopes Compiladores 5 / 31

Page 6: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Automatos Finitos: implementacao

Como traduzir qualquer DFA?

Como ficara a complexidade do codigo se existirem muitos estadosem caminhos arbitrarios?

Bruno Lopes Compiladores 6 / 31

Page 7: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

q0 q1 q2 q3 q4/ * *

other

/

*

other

Bruno Lopes Compiladores 7 / 31

Page 8: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

if (next character is "/")

advance the input;

if (next character is "*"

advance the input;

done = false;

while (! done )

while (next character is not "*")

advance the input;

advance the input;

while (next character is "*")

advance the input;

if (next character is "/")

done = true;

advance the input

accept;

Bruno Lopes Compiladores 8 / 31

Page 9: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

E possıvel melhorar

Usar uma variavel para manter o estado corrente

Usar um case dentro do loop

um comando para testar o estado correnteum comando para testar o caracter de entrada

Bruno Lopes Compiladores 9 / 31

Page 10: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

state = 1

while (state = 1 or state = 2)

case state:

1: case input character

letter: advance the input; state = 2

else state = ... (erro, p.ex.)

2: case input character

letter or digit: advance the input; state = 2

else state = 3

if state = 3; accept

Bruno Lopes Compiladores 10 / 31

Page 11: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

DFA como uma tabela de transicoes

caracteres no alfabeto

estados estados representando transicoes com o caracter aceitacao?

Bruno Lopes Compiladores 11 / 31

Page 12: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Tabela de transicao

letra dıgito outro aceitacao

1 2 — 3 nao

2 2 2 3 sim

3 3 3 3 nao

1 2

3

letra

outro

letra

dıgitooutro

qualquer

Bruno Lopes Compiladores 12 / 31

Page 13: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Codigo dirigido a tabela

state = 1

ch = next input character

while (not Accept[state] and not error(state))

newState = T[state, ch];

if (Advance[state, ch])

ch = next input character

state = newState;

if (Accept[state])

accept;

Bruno Lopes Compiladores 13 / 31

Page 14: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Vantagens

codigo reduzido

facil de manter

generico

Desvantagens

Tabela pode ficar muito grande

Bruno Lopes Compiladores 14 / 31

Page 15: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Linguagem Tiny

Variaveis inteiras

Declaracao a partir da atribuicao de valores

Controle com if e repeat

if termina com end e tem um else opcional

Comentarios entre chaves

Expressoes aritmeticas e booleanas

Bruno Lopes Compiladores 15 / 31

Page 16: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Scanner para a Tiny

Tokens

palavras reservadas: if, then, else, end, repeat, until, read, write

Sımbolos especiais: +, -, *, /, =, ¡ , (, ), ;, :=

numeros: 1 ou mais dıgitos

identificadores: 1 ou mais letras

Bruno Lopes Compiladores 16 / 31

Page 17: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Scanner para a Tiny

Comentarios entre chaves

espacos em branco sao ignorados

Princıpio de reconhecimento da string mais longa

Palavras reservadas tratadas como identificador (categoria sintatica?)

ERs simples

DFA?

Bruno Lopes Compiladores 17 / 31

Page 18: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Scanner para a Tiny

Comentarios entre chaves

espacos em branco sao ignorados

Princıpio de reconhecimento da string mais longa

Palavras reservadas tratadas como identificador (categoria sintatica?)

ERs simples

DFA?

Bruno Lopes Compiladores 17 / 31

Page 19: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

{Exemplo de programa em Tiny - Fatorial}

read x; {inteiro de entrada}

if x > 0 then {express~ao booleana}

fact := 1;

repeat

fact := fact * x;

x := x + 1;

until x = 0;

write fact;

end

Bruno Lopes Compiladores 18 / 31

Page 20: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Geradores de Scanner

Lex and Flex seguem o caminho usual

Algoritmos sao bem conhecidos e entendidos

Problema chave: interface para o parse

Bruno Lopes Compiladores 19 / 31

Page 21: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Lex

Gerador de analisador lexico

Entrada: ERs

Saıda: lex.yy.c

Bruno Lopes Compiladores 20 / 31

Page 22: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Formato de entrada

{definitions}

%%

{rules}

%%

{auxiliary routines}

Bruno Lopes Compiladores 21 / 31

Page 23: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Lex com Tiny

arquivo de entrada para o lex com as especificacoes da linguagem

executa lex com esse arquivo de entrada: produz lexyy.c com oanalisador lexico de Tiny

compila lexyy.c

executa com um programa escrito em Tiny

Devolve os tokens do programa

Bruno Lopes Compiladores 22 / 31

Page 24: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

JFlex

Gerador de analisador lexico Java, inspirado no Lex

codigo Java (entra no arquivo de classe do scanner, mas fora da classe, geralmente pacotes a serem referenciados na classe)

%%

opc~oes e declarac~oes (como o scanner e gerado)

%%

regras do scanner (ERs e ac~oes)

Bruno Lopes Compiladores 23 / 31

Page 25: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Regras e acoes

Formato

EXPRESSAOREGULAR CODIGO JAVA

O codigo e inserido no metodo do scanner que fornece um token

para pegar o valor do lexema, use yytext()

Deve incluir um return

<<EOF>> indica fim do arquivo

[0-9]+ { return new Token(Token.NUM, yytext(), yyline); }

Bruno Lopes Compiladores 24 / 31

Page 26: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Regras e acoes

Ao consumir a entrada, o scanner determina a porcao regular mais longacorrespondente

Se existir mais de uma, ele escolhe a que foi definida primeiro

Se nao existir nenhuma, da uma mensagem de erro

Bruno Lopes Compiladores 25 / 31

Page 27: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Estados

Ao consumir a entrada, o scanner determina a porcao regular mais longacorrespondente

Usados para restringir o conjunto de expressoes regulares que podemser associadas a uma entrada

Podem ser exclusivos ou nao

Expressao regular sera correspondente a uma entrada quando

conjunto de estados lexicos inclui o estado ativo do scannerconjunto de estados esta vazio e o estado lexico nao e exclusivo

Bruno Lopes Compiladores 26 / 31

Page 28: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Estados

Estado corrente ativo pode ser alterado com o metodo yybegin()

Estado inicial e o YYINITIAL (inclusivo), default

Uma lista de estados pode ser associada com uma ER

Bruno Lopes Compiladores 27 / 31

Page 29: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Exemplo

%states A, B

%xstates C

%%

// n~ao tem estado listado: match com todos os estados,

// exceto com C (exclusivo)

expr1 { yybegin(A); action }

<YYINITIAL, A> expr2 { action }

<A> {

expr3 { action }

<B,C> expr4 { action }

Bruno Lopes Compiladores 28 / 31

Page 30: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Uso de estados: regras lexicas distintas para entradas iguais

HTML: regras lexicas para elementos que aparecem dentro ou fora deuma tag

Entradas que nao podem ser reconhecidas por expressoes regulares

aninhamento de comentarios

/* comeca o primeiro /* aqui tem outro */ termina o primeiro */

Bruno Lopes Compiladores 29 / 31

Page 31: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Exemplo

%state TAG // sec~ao de declarac~oes

%%

<YYINITIAL> {//sec~ao de regras

[<] { yybegin(TAG); return new Token(‘<‘); }

[^<]+ { return new Token(TOKEN.PALAVRA, yytext()); }

}

<TAG> {

[>] { yybegin(YYINITIAL); return new Token(‘>’);

... outras regras ...

}

Bruno Lopes Compiladores 30 / 31

Page 32: Compiladores - Análise Léxicabruno/uploads/Lectures/CompAula3.pdf · C Lex com Tiny arquivo de entrada para o lex com as especi ca˘c~oes da linguagem executa lex com esse arquivo

Instituto de

C

Como estados poderiam ser usados para controlar comentariosaninhados?

Implemente a entrada para o JFlex e o que mais for necessario parareconhecer uma linguagem de calculadora. Alem de numeros inteirose com ponto flutuante, os operadores permitidos sao(,),+,-,*,/,//,**. Qualquer outro sımbolo deve gerar um erro

Bruno Lopes Compiladores 31 / 31