Você está na página 1de 10

DAVIS MIYASHIRO

davis.jp(a)hotmail.com.br

FABIO GINZEL
Fabioginzel(a)gmail.com

MARIO MATIUSSO
mario3001(a)ig.com.br

Projeto de um compilador de Linguagem DFM

Relatrio apresentado Universidade Federal do ABC


como parte dos requisitos para aprovao na disciplina de
Compiladores do Curso de Cincias da Computao.

Professor: Dr. Isidro Masseto

Santo Andr - SP
2011

Sumrio
1 Introduo......................................................................................................................................................3
1.1 Analisador lxico (ou scanner) .........................................................................................................................................3
1.2 Analisador sinttico (ou parser) ......................................................................................................................................3
1.3 Analisador semntico .......................................................................................................................................................4
1.4 Otimizao de cdigo ........................................................................................................................................................4
1.5 Gerao de cdigo..............................................................................................................................................................4

2 Objetivo..........................................................................................................................................................4
3 Linguagem......................................................................................................................................................5
3.1 Inicio de um programa:.....................................................................................................................................................5
3.2 Variveis:............................................................................................................................................................................5
3.3 Cdigo.................................................................................................................................................................................5
3.4 Equivalncia da Linguagem..............................................................................................................................................5

4 Gramtica.......................................................................................................................................................6
5 Concluses....................................................................................................................................................10

1 Introduo
O objetivo de um compilador traduzir as sequncias de caracteres que representam o programa
fonte em cdigo executvel. Essa tarefa complexa o suficiente de forma que um compilador
pode ser dividido em processos menores interconectados.

Figura 1: Estrutura geral de um compilador

1.1

Analisador lxico (ou scanner)

O analisador lxico separa a seqncia de caracteres que representa o programa fonte em


entidades ou tokens, smbolos bsicos da linguagem. Durante a anlise lxica, os tokens so
classificados como palavras reservadas, identificadores, smbolos especiais, constantes de tipos
bsicos (inteiro real, literal, etc.), entre outras categorias.
1.2

Analisador sinttico (ou parser)

O analisador sinttico agrupa os tokens fornecidos pelo analisador lxico em estruturas


sintticas, construindo a rvore sinttica correspondente. Para isso, utiliza uma srie de regras de
sintaxe, que constituem a gramtica da linguagem fonte. a gramtica da linguagem que define
a estrutura sinttica do programa fonte. O analisador sinttico tem tambm por tarefa o
reconhecimento de erros sintticos, que so construes do programa fonte que no esto de
acordo com as regras de formao de estruturas sintticas como especificado pela gramtica.

4
1.3

Analisador semntico

O analisador semntico utiliza a rvore sinttica determinada pelo analisador sinttico para:
identificar operadores e operandos das expresses, reconhecer erros semnticos, fazer
verificaes de compatibilidade de tipo, analisar o escopo das variveis, fazer verificaes de
correspondncia entre parmetros atuais e formais.
1.4

Otimizao de cdigo

O processo de otimizao de cdigo consiste em melhorar o cdigo intermedirio de tal forma


que o programa objeto resultante seja mais rpido em tempo de execuo.
1.5

Gerao de cdigo

A fase final do compilador a gerao do cdigo para o programa objeto, consistindo


normalmente de cdigo em linguagem assembly ou de cdigo em linguagem de mquina.

2 Objetivo
Este trabalho tem como objetivo detalhar o projeto e construo de um compilador. O compilador
que ser construdo neste trabalho dever realizar o parse da linguagem DFM (descrita no
capitulo 3) para a linguagem JAVA.
A linguagem DFM uma linguagem construda com o objetivo didtico da disciplina de
compiladores.
O compilador construdo no realizar a gerao de cdigo intermedirio nem a otimizao de
cdigo. O programa objeto ser uma classe na liguagem JAVA.
Como ferramenta de apoio para a criao do analisador Lxico e Sinttico foi utilizado o antlr
verso 3.4. Detalhes sobre o antlr so encontrados no link http://www.antlr.org/.

3 Linguagem
Aqui vamos descrever em linhas gerais as caractersticas e estrutura lgica da linguagem DFM:
3.1

Inicio de um programa:

Dever ser iniciado com a palavra reservada: inicio_do_programa


3.2

Variveis:

Devero ser feitas todas declaradas no inicio do programa (antes das chaves). No
permitido declarar variveis ao longo do programa. Os tipos reconhecidos so Int, Real,
Char e String.

Todas as variveis so iniciadas com o valor = 0 para real ou inteiro e null no caso de char
e string.

As variveis so fortemente tipadas e so compatveis apenas com variveis do mesmo


tipo.

3.3

No so permitidos nmeros negativos para as variveis numricas.


Cdigo
O bloco de programa (ou Main) caracterizado atravs de chaves {}. Ou seja, o

programa ficar entre chaves.


3.4

Equivalncia da Linguagem

A tabela abaixo mostra a equivalncia da linguagem DFM para a linguagem JAVA.


DFM
Inicio_do_programa
fim_do_programa
Se
senao
enquanto
int
real
string
char

leia

escreva

JAVA
public class Resultado {
public static void main(String args[]) {
}
if
else
while
int
floar
string
char
import java.util.Scanner; (No cabealho do arquivo)
Scanner _sscnscanner = new Scanner(System.in);
Integer.parseInt(_sscnscanner.nextLine()); (Caso Inteiro)
Double.parse Double (_sscnscanner.nextLine()); (Caso Real)
_sscnscanner.nextLine().substring(0,1); (Caso Char)
_sscnscanner.nextLine(); (Caso String)
System.out.println
Tabela 1: Equivalncias das linguagens

4 Gramtica
Nesta seo sero mostrados os grafos relativos a gramtica da linguagem DFM.

principal inicio_do_programa declaracao* AC cmd* FC fim_do_programa

declaracao (declaracao_inteiro | declaracao_real | declaracao_texto | declaracao_caracter) FIM_LINHA

declaracao_inteiro int ID FIM_LINHA

declaracao_real real ID FIM_LINHA

declaracao_texto string ID FIM_LINHA

declaracao_caracter char ID FIM_LINHA

cmd cmd_escrita | cmd_leitura | cmd_se | cmd_enquanto | cmd_atribuicao

cmd_escrita escreva ID FIM_LINHA

cmd_leitura leia ID FIM_LINHA

cmd_se se AP termo comparador termo FP bloco_cmd cmd_senao?;

cmd_senao (senao bloco_cmd);

bloco_cmd AC cmd* FC

cmd_enquanto enquanto AP termo comparador termo FP AC cmd* FC

comparador IGUAL | MENOR | MAIOR;


Segue o mesmo padro dos anteriores...
cmd_atribuicao ID ATRIBUICAO expr FIM_LINHA
Segue o mesmo padro dos anteriores...
termo_num INT | FLOAT
Segue o mesmo padro dos anteriores...
termo_str CHAR | STRING
Segue o mesmo padro dos anteriores...
termo termo_num | termo_str | ID
Segue o mesmo padro dos anteriores...

expr expr_num | termo_str


Segue o mesmo padro dos anteriores...

8
expr_num termo_num ((SOMA | SUB | DIV | MULT) termo_num)*
Segue o mesmo padro dos anteriores...
ID ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*

INT '0'..'9'+
Segue o mesmo padro...
FLOAT ('0'..'9')+ '.' ('0'..'9')* | '.' ('0'..'9')+ | ('0'..'9')+

COMENTARIO '//' ~('\n'|'\r')* '\r'? '\n' | '/*'

ESPACO ( ' ' | '\t' | '\r')


Segue o mesmo padro...
ENTER ('\r')
Segue o mesmo padro...
STRING '"' ( ~('\\'|'"') )* '"'
Segue o mesmo padro...
SOMA '+'
Segue o mesmo padro...
CHAR '\'' ( ~('\''|'\\') ) '\''
Segue o mesmo padro...

9
SUB '-'
Segue o mesmo padro...
MULT '*'
Segue o mesmo padro...
DIV '/'
Segue o mesmo padro...
AP '('
Segue o mesmo padro...
FP ')'
Segue o mesmo padro...
AC '{'
Segue o mesmo padro...
FC '}'
Segue o mesmo padro...
ATRIBUICAO '='
Segue o mesmo padro...
IGUAL '=='
Segue o mesmo padro...
MAIOR '>'
Segue o mesmo padro...
MENOR '<'
Segue o mesmo padro...
FIM_LINHA ';'
Segue o mesmo padro...

10

5 Concluses
Conclumos que construir um compilador da um puta trabalho, mesmo para uma linguagem extremamente
simples como a DFM. Por outro lado o Antlr se mostrou uma ferramenta sensacional. Poupou grande
trabalho no desenvolvimento de cdigo para a anlise lxica e sinttica.
Claro que devido falta de tempo, no construmos nada profissional, porm todos os conceitos aplicados
neste projeto podem ser facilmente entendidos para aplicaes reais. (algum faz a concluso?)