Você está na página 1de 38

LINGUAGENS E

COMPILADORES
Conceitos de Linguagens de
Programação e Análise Léxica
LINGUAGENS E COMPILADORES
Agenda:

1. Conceitos de Linguagens de Programação


2. Análise Léxica
3. Terminologia Básica e Simbologia
4. Da Expressão Regular ao Autômato
5. Implementação de DFA
6. Gerador de Analisadores Léxicos
Obs.:
a. Leia a apresentação de introdução da disciplina.
b. Veja as apresentações sobre Linguagens de Programação
deste módulo
Prof. Dr. Ricardo Luis de Azevedo da Rocha
1. CONCEITOS DE LINGUAGENS DE
PROGRAMAÇÃO
• Aumento da capacidade de expressar ideias
• Limitações de uma linguagem
• Tipos de estrutura de dados
• Tipos de estrutura de controle
• Tipos de abstrações que podem ser utilizadas
• Assim, as formas de algoritmos também são
limitadas
• Conhecimento de recursos de linguagens de
programação reduz essas limitações
• Programadores aumentam seu poder de expressão
aprendendo novas construções de linguagens
DEFINIÇÃO DE LINGUAGEM DE
PROGRAMAÇÃO
• Sintática: Uma linguagem de
programação é uma notação utilizada
pelo programador para especificar ações
a serem executadas por um computador
• Semântica: Uma linguagem de
programação compreende um conjunto
de conceitos que um programador usa
para resolver problemas de programação
DOMÍNIOS DE PROGRAMAÇÃO
• Aplicações científicas
• Aplicações comerciais
• Inteligência artificial
• Sistemas básicos
• Aplicações Internet
DOMÍNIOS DE PROGRAMAÇÃO
GUIS,
portabilidade
...
expressiva,
eficiente,
IDEs expressiva ,
usuários simples

aplicações
desenvolvedores
ARQUITETURA DE VON NEUMANN
COMPUTADOR E LINGUAGENS
• Um computador pode ser representado por:
• uma máquina virtual, capaz de executar operações mais abstratas
(representadas através de uma linguagem de programação)
• uma máquina real, capaz de executar um determinado conjunto de
operações concretas (expressas em linguagem de máquina)

L1: máquina assembler


L0: máquina real
L2 máquina C
L3 máquina Pascal
LINGUAGENS E MÁQUINAS
• Cada máquina representa um conjunto integrado
de estruturas de dados e algoritmos
• Cada máquina é capaz de armazenar e executar
programas em uma linguagem de programação
L1, L2, L3,...Ln.
L1
L2
L3
Ln

máquina
vitual mapeamento
L0
DEFINIÇÃO
• Compilador: Um programa de computador que
traduz código escrito em uma determinada
linguagem (código-fonte) em código escrito em
outra linguagem (linguagem-objeto).
Exemplos:
• Traduzir de C++ para C
• Traduzir de Java para JVM
• Traduzir de C para C (Por que?) Para tornar o código mais
eficiente, menor, mais rápido, ou mesmo medir
desempenho).
DEFINIÇÃO
• Compilador: Um programa de computador que
traduz código escrito em uma determinada
linguagem (código-fonte) em código escrito em
outra linguagem (linguagem-objeto).
Exemplos:
• Traduzir de C++ para C
• Traduzir de Java para JVM
• Traduzir de C para C (Por que? Para tornar o
código mais eficiente, menor, mais rápido,
ou mesmo medir desempenho).
ESTRUTURA LÓGICA Árv. sint.
Código e tabela
fonte Analisador Tokens Analisador Árvore Analisador símbolos
Léxico Sintático sintática Semântico
Identifica palavras Identifica estrutura Identifica Tipos, etc.
Operadores, números, Expressões, declarações,
etc. etc.

Gerador de Repres. Otimizador Repres. Gerador Código


Código Int. Interna de Código Interna de Código Objeto
Gera representação interna Transforma Gera código objeto
através da árvore sintática representação interna, Traduz representação
modifica código interna para linguagem
(desempenho) objeto (ex. Assembly)
FRONT-END E BACK-END
2. ANÁLISE LÉXICA
• Léxico
• Conjunto de palavras de um determinado idioma
• Conjunto de objetos de uma determinada linguagem

Tokens etc.
Nome de
variáveis Números Palavras-chave

• Analisador Léxico
• Recebe como entrada um string e retorna
tokens
• Retira símbolos sem valor sintático/
semântico
Slide extraído de Clauirton Siebra – UFPB “Construção de Compiladores”
DEFINIÇÃO
• Entrada: Arquivo texto contendo os strings segundo
alguma codificação (ASCII, UTF-8, etc.).
• Saída: Tokens - representação dos lexemas (objetos
léxicos da linguagem, ex.: IF, ELSE, etc.) sob a forma
de estrutura de dadosclasse, valor.
• classe: indica a classificação que pode ser
número, identificador, palavra-reservada,
etc.
• valor: o valor do token, por exemplo se for
número seu valor numérico – “12”  12.
DEFINIÇÃO
• Os tokens usualmente são definidos pelo seu lexema
(string ou sequência de caracteres que compõem um
único token) e atributos adicionais.
• Os tokens podem ser entregues ao parser como tuplas
na forma <a, b,..., n > assim, a entrada:
a=b+3
• poderia gerar as tuplas <classe, valor>:
<id, a> <=,> <id, b> <+,> <num, 3>
• note “a” e “b” podem ser ponteiros
para outra estrutura de dados (tabela de
símbolos) e que alguns tokens não
necessitam atributos adicionais.
Slide modificado de Maurício Rodrigues de Morais – “Compiladores”
OBJETIVO
• Remoção de espaços em branco e
comentários.
• Identificação de constantes.
• Identificação de palavras-reservadas
(construções da linguagem).
• Reconhecimento dos identificadores.
• Separação entre o analisador sintático
e a representação da entrada.
Slide extraído de Maurício Rodrigues de Morais – “Compiladores”
CLASSES DE TOKENS
• As linguagens de programação usualmente
distinguem certas classes ou tipos de tokens:
• palavras-reservadas
• operadores
• identificadores
• números
• literais
• símbolos de pontuação
Slide extraído de Maurício Rodrigues de Morais – “Compiladores”
ATRIBUTOS DOS TOKENS
• Quando um lexema é reconhecido por um
padrão, o analisador léxico deve
providenciar outras informações adicionais
(atributos) conforme o padrão.
Analisador
lexema classe Gramatical

Analisador token
Léxico atributos
Geração de
Código

Slide modificado de Maurício Rodrigues de Morais – “Compiladores”


EXEMPLOS
Token Lexemas Exemplo Descrição informal do padrão
if if if
relação <, <=, =, >, >= < ou <= ou = ou > ou >=
id pi, contador, varSoma Letra seguida por letras ou dígitos
num 3.1416, 0, 6.02E23 Qualquer constante numérica
string “string qualquer” Quaisquer caracteres entre aspas, exceto
aspas

Slide extraído de Guilherme Amaral Avelino – “Compiladores”


INTERAÇÃO ENTRE LÉXICO E
SINTÁTICO
• Um analisador léxico interage com a entrada e com o
parser (analisador sintático ou gramatical):
Entrega de
Leitura de tokens e seus
caractere atributos
Analisador Analisador
Entrada
Léxico Sintático
Devolução Pedido
de caractere de token
Inserção ou
Consulta
Consulta Tabela de
Símbolos

Slide extraído de Maurício Rodrigues de Morais – “Compiladores”


INFORMAÇÃO NECESSÁRIA:
• Linguagens regulares
• “Constituem um conjunto de linguagens que
podem ser geradas por gramáticas regulares,
reconhecidas por autômatos finitos e
facilmente descritas por expressões simples,
chamadas expressões regulares”

Slide extraído de Clauirton Siebra – UFPB “Construção de Compiladores”


3. TERMINOLOGIA BÁSICA E SIMBOLOGIA
• Linguagem: Conjunto (coleção) de cadeias de símbolos
• Cadeias: Sentenças (ou palavras, strings) da linguagem
• Símbolos: Elementos de um alfabeto que justapostos formam as
sentenças (chamados de tokens na linguagem léxica)
• Alfabeto: Conjunto finito (em nosso caso de símbolos
codificados)
• Formas de representação de linguagens infinitas:
• Conjunto de leis de formação das cadeias
(gramática)
• Conjunto de regras de aceitação das cadeias
(reconhecedores)
• Conjunto de funções (funcional)
• Derivação: utilizar leis de formação para obter
uma sentença
EXPRESSÕES REGULARES
• Constituída a partir de regras de definição aplicadas a
um conjunto de expressões regulares mais simples:
•  é uma expressão regular (contém a cadeia vazia)
• Se a é um símbolo do alfabeto (), a é uma expressão
regular
• Supondo-se que r e s são expressões
regulares que denotam as linguagens
L(r) e L(s), tem-se:
• (r) | (s) é expressão regular [L(r)  L(s)]
• (r) (s) é expressão regular [L(r) L(s)]
• (r)* é expressão regular [(L(r))*]
• (r) é expressão regular [L(r)]
• Qual a linguagem de ?
EXPRESSÕES REGULARES
• Reescrever a expressão regular até se obter
apenas uma sequência de letras (string)
Exemplo
(0 | 1)*”.”(0 | 1)*
Regras gerais (0 | 1)(0 | 1)*”.”(0 | 1)*
1) r1| r2 → r1 1(0 | 1)*”.”(0 | 1)*
2) r1| r2 → r2 1”.”(0 | 1)*
3) r* → rr* 1”.”(0 | 1)(0 | 1)*
4) r* →  1”.”(0 | 1)
1”.”0
Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”
RECONHECEDORES
• Alternativa para a definição de uma linguagem, na qual utiliza-se
dispositivos aceitadores denominados reconhecedores da
linguagem.
• Um reconhecedor é dispositivo conceitual composto de texto de
entrada (cadeia de símbolos), cursor de leitura, controle (máquina
finita de estados) que pode usar uma memória auxiliar
• Há dois tipos de reconhecedores: determinísticos
(um único movimento para qualquer configuração)
e não-determinísticos (conjunto de movimentos
possíveis para cada configuração)
• Um reconhecedor pode definir uma linguagem
(quando só aceita cadeias desta linguagem)
• Para linguagens regulares o reconhecedor
empregado é o autômato de estados finitos
(DFA, ou NFA)
Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”
AUTÔMATOS FINITOS
• Exemplo Estado de início

(0 | 1)* “.”(0 | 1)* Estado de aceitação


1 1

0 0

Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”


NFA × DFA
• DFA
• Sem transições 
• No máximo uma transição de cada estado para cada
símbolo
a a
OK NOT
b OK a
• NFA – nenhuma destas restrições
Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”
4. DA EXPRESSÃO REGULAR
AO AUTÔMATO

Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”


REGRAS DE CONVERSÃO
  
r1.r2 r1 r2
a a
r1 | r2  r1 
 
 r2 

r*
 r 

Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”
NFA PARA DFA • Exemplo: (0 | 1)*.(0|1)*

3 1
 11 1 13

   10  
1  2
 4
5

6 
7  8 . 9
 12 14 
15  16
0 0
 

Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”


NFA PARA DFA • Exemplo: (0 | 1)*.(0|1)*

1 1
5,7,2,3,4,8 13,15,10,11,12,16
1 1
1,2,3,4,8 1 9,10,11,12,16 1
0 0
0 6,7,2,3,4,8 0 14,15,10,11,12,16
0 0

Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”


EXEMPLO DE CATEGORIAS
LEXICAIS
•Palavra_chave_if = if
•Palavra_chave_while = while
•Operador = +|-|*|/
•Inteiro = [0-9] [0-9]*
•Float = [0-9]*. [0-9]*
•Identificador = [a-z]([a-z]|[0-9])*
•Na análise sintática utilizaremos
estas categorias
Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”
INTERPRETADOR DO DFA
Algoritmo do Interpretador
State = DFA initial state;
inputChar = getchar();
While(inputChar) {
State = trans(State, inputChar]);
inputChar = getchar();
}
If(State é um estado de aceitação)
realizar ação relativa ao estado State (reconheceu String)
Else
realizar outra ação

Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”


5. IMPLEMENTAÇÃO DO DFA
• Implementar a tabela de transições de
estados com um array bidimensional

1 1
2 5
1 1
1 1 4 1
0 0
0 3 0 6
0 0

Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”


5. IMPLEMENTAÇÃO DO DFA
• Implementar a tabela de transições de
estados com um array bidimensional
Estado Próximo Estado
Atual
“0” “1” “.”
0 0 0 0
1 3 2 4
2 3 2 4
3 3 2 4
4 6 5 0
5 6 5 0
6 6 5 0

Slide extraído de João M. P. Cardoso – Universidade do Algarve “Compiladores”


6. GERADOR DE ANALISADORES
LÉXICOS
• Auxiliam na construção de analisadores Léxicos
• Utilizam expressões regulares para descrever tokens
• Permite a combinação da identificação de padrões com execução de
ações
• Compilador e linguagem Lex
• Ex:
• Flex – versão GNU do lex para C.
http://www.monmouth.com/~wstreett/lex-yacc/lex-yacc.html
• Jlex – versão Java com pequena diferença na sintaxe de entrada.
http://www.cs.princeton.edu/~appel/modern/java/JLex/
• CSLex – versão C#, derivada do Jlex.
http://www.cybercom.net/~zbrad/DotNet/Lex

Slide extraído de Guilherme Amaral Avelino – “Compiladores”


LINGUAGENS E
COMPILADORES
Conceitos de Linguagens de
Programação e Análise Léxica

Você também pode gostar