compiladores - autômatosdcc.ufrj.br/~fabiom/comp/03automatos.pdf · especificação x...
TRANSCRIPT
![Page 1: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/1.jpg)
Compiladores - Autômatos
Fabio Mascarenhas – 2018.1
http://www.dcc.ufrj.br/~fabiom/comp
![Page 2: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/2.jpg)
Especificação x Implementação
• Usamos expressões regulares para dar a especificação léxica da linguagem
• Mas como podemos fazer a implementação do analisador léxico a partir dessa
especificação?
![Page 3: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/3.jpg)
Especificação x Implementação
• Usamos expressões regulares para dar a especificação léxica da linguagem
• Mas como podemos fazer a implementação do analisador léxico a partir dessa
especificação?
• Autômatos finitos!
• Algoritmos para converter expressões regulares são conhecidos e podem
ser reaproveitados, e autômatos levam a um analisador léxico bastante
eficiente
![Page 4: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/4.jpg)
Autômatos Finitos
• Um autômato finito é formado por:
• Um alfabeto de entrada
• Um conjunto de estados
• Um estado inicial
• Um conjunto de estados finais rotulados
• Um conjunto de transições entre estados
![Page 5: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/5.jpg)
Transições
• Uma transição s1 -a-> s2 quer dizer que se autômato está no estado s1 e o
próximo símbolo da entrada é a então ele vai para o estado s2
• Se não há mais caracteres na entrada e estamos em um estado final então o
autômato aceitou a entrada
• Se em algum ponto não foi possível tomar nenhuma transição, ou a entrada
acabou e não estamos em um estado final, o autômato rejeitou a entrada
![Page 6: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/6.jpg)
Graficamente
![Page 7: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/7.jpg)
Graficamente
estado
![Page 8: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/8.jpg)
Graficamente
estadoestado inicial
![Page 9: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/9.jpg)
Graficamente
estadoestado inicial estado final
![Page 10: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/10.jpg)
Graficamente
estadoestado inicial estado final
transição
![Page 11: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/11.jpg)
Graficamente
estadoestado inicial estado final
transição
a b c
![Page 12: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/12.jpg)
Graficamente
(0|1)*00
![Page 13: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/13.jpg)
Transições ∊
• Uma transição ∊ é uma transição que pode ser tomada espontaneamente pelo
autômato, sem ler nenhum símbolo da entrada
• Podemos também construir um autômato que pode tomar mais de uma
transição dado um estado e um símbolo
• Autômatos com transições ∊ e múltiplas transições saindo de um mesmo
estado para um mesmo caractere são não-determinísticos
![Page 14: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/14.jpg)
DFA vs NFA
• Um DFA é um autômato determinístico, um NFA é não-determinístico
• Um DFA, dada uma entrada, toma apenas um caminho através dos seus
estados
• Um NFA toma todos os caminhos possíveis para aquela entrada, e aceita
entrada se pelo menos um caminho termina em um estado final
![Page 15: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/15.jpg)
Funcionamento de um NFA
• Entrada:
• Estados:
![Page 16: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/16.jpg)
Funcionamento de um NFA
• Entrada: 1
• Estados: { 0 }
![Page 17: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/17.jpg)
Funcionamento de um NFA
• Entrada: 1 0
• Estados: { 0 } { 0, 1 }
![Page 18: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/18.jpg)
Funcionamento de um NFA
• Entrada: 1 0 0
• Estados: { 0 } { 0, 1 } { 0, 1, 2 }
![Page 19: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/19.jpg)
Funcionamento de um NFA
• Entrada: 1 0 0
• Estados: { 0 } { 0, 1 } { 0, 1, 2 }
• Aceita!
![Page 20: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/20.jpg)
Funcionamento de um NFA
• Entrada: 0
• Estados: { 0, 1 }
![Page 21: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/21.jpg)
Funcionamento de um NFA
• Entrada: 0 1
• Estados: { 0, 1 } { 0 }
• Não aceita!
![Page 22: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/22.jpg)
Autômatos e linguagens
• DFAs, NFAs e expressões regulares todos expressam a mesma classe de
conjunto de símbolos
• Linguagens regulares
• Isso quer dizer que podemos converter de um para outro
• DFAs são mais rápidos para executar
• NFAs têm representação mais compacta
• Expressões regulares são mais fáceis de entender qual conjunto está sendo
expresso
![Page 23: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/23.jpg)
Autômatos e linguagens
• DFAs, NFAs e expressões regulares todos expressam a mesma classe de
conjunto de símbolos
• Linguagens regulares
• Isso quer dizer que podemos converter de um para outro
• DFAs são mais rápidos para executar
• NFAs têm representação mais compacta
• Expressões regulares são mais fáceis de entender qual conjunto está sendo
expresso
Por isso usamos
expressões regulares
para a especificação,
e DFAs (ou NFAs) para
implementação!
![Page 24: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/24.jpg)
DFA de análise léxica
• Um DFA de análise léxica tem os estados finais rotulados com tipos de token
• A ideia é executar o autômato até chegar no final da entrada, ou dar erro por
não conseguir fazer uma transição, mantendo uma pilha de estados visitados e
o token que está sendo lido
• Então voltamos atrás, botando símbolos de volta na entrada, até chegar em um
estado final, que vai dar o tipo do token
![Page 25: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/25.jpg)
Analisador léxico de tabela
// reconhecer próximo tokenestado = s0
lexema = “”pilha.limpa()
while (!eof && estado ≠ erro) dochar = leChar()lexema = lexema + charpush (estado)estado = trans(estado,char)
end;
// limpar estado finalwhile (estado ∉ SF && !pilha.vazia()) do
estado ← pilha.pop()lexema = lexema.truncaUltimo()voltaChar()
end;
if (estado ∈ SF ) // rótulo do estado é tipo do tokenthen return <estado.rotulo, lexema>else return erro
![Page 26: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/26.jpg)
Exemplo
![Page 27: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/27.jpg)
Uma otimização
• Se visitamos um estado final então podemos limpar a pilha, já que vamos parar
nele na volta
// reconhecer palavrasestado = s0
lexema = “”pilha.limpa()
while (!eof && estado ≠ erro) dochar = leChar()lexema = lexema + charif estado ∈ SF
then pilha.limpa()push (estado)estado = trans(estado,char)
end;
// limpar estado finalwhile (estado ∉ SF and !pilha.vazia()) do
estado ← pilha.pop()lexema = lexema.truncaUltimo()voltaChar()
end;
if (estado ∈ SF ) // rótulo do estado é tipo do tokenthen return <estado.rotulo, lexema>else return erro
![Page 28: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/28.jpg)
Construindo o DFA de análise léxica
• Passo 1: construir um NFA para cada regra, o estado final desse NFA é
rotulado com o tipo do token
• Construção de Thompson
• Passo 2: combinar os NFAs em um NFA com um estado inicial que leva aos
estados iniciais do NFA de cada regra via uma transição ∊
• Passo 3: transformar esse NFA em um DFA, estados finais ficam com o rótulo
da regra que aparece primeiro
• Algoritmo de construção de subconjuntos
![Page 29: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/29.jpg)
DFA da linguagem de comandos simples
![Page 30: Compiladores - Autômatosdcc.ufrj.br/~fabiom/comp/03Automatos.pdf · Especificação x Implementação •Usamos expressões regulares para dar a especificação léxica da linguagem](https://reader035.vdocuments.site/reader035/viewer/2022062505/5bb1286109d3f246678d157a/html5/thumbnails/30.jpg)
[+] vs [++]