OS COMPILADORES
Por: Jéssica Egidio. • 17/10/2019 • Trabalho acadêmico • 1.035 Palavras (5 Páginas) • 159 Visualizações
void atribui() : {}
{
}
void expressao() : {}
{
fator() (
}
void fator() : {}
{
}
void numero() : {}
{
}
void unidade() : {}
{
}
void dezena() : {}
{
}
void centena() : {}
{
}
void milhar() : {}
{
}
a := 1;
a := DCCXX + MM;
exibe a;
x := I;
y := II;
z := 3;
soma := x + y + z + 47;
exibe soma;
quem quiser depois eu passo a resp.
/* CompiladorExemplo.jj - Gerador de código intermediário e destino para o programa fonte completo
- O gerador de código destino se encontra na chamada (linha 23) do método estático:
GeradorCodigoDestino.geraCodigoAssembler(listaComandos);
*/
options {
JDK_VERSION = "1.5";
DEBUG_PARSER = false;
DEBUG_TOKEN_MANAGER = false;
}
PARSER_BEGIN(CompiladorExemplo)
import java.io.*;
import java.util.LinkedList;
public class CompiladorExemplo {
static Tabela tabela = new Tabela();
static LinkedList
public static void main(String args[]) throws ParseException {
CompiladorExemplo analisador = null;
try {
analisador = new CompiladorExemplo(new FileInputStream("prog_fonte.my"));
listaComandos = analisador.inicio();
// System.out.println(tabela.toString());
// System.out.println(listaComandos);
GeradorCodigoDestino.geraCodigoAssembler(listaComandos);
}
catch(FileNotFoundException e) {
System.out.println("Erro: arquivo não encontrado");
}
catch(TokenMgrError e) {
System.out.println("Erro léxico\n" + e.getMessage());
}
catch(ParseException e) {
System.out.println("Erro sintático\n" + e.getMessage());
}
}
}
PARSER_END(CompiladorExemplo)
SKIP : { " " | "\t" | "\r" | "\n" }
TOKEN [IGNORE_CASE] : {
}
TOKEN : {
< IDENT: (["a"-"z"])+ > |
< ATRIB: ":=" > |
< ADICAO: "+" > |
< PT_VIRG: ";" > |
< UM: "I" > |
< DOIS: "II" > |
< TRES: "III" > |
< QUATRO: "IV" > |
< CINCO: "V" > |
< SEIS: "VI" > |
< SETE: "VII" > |
< OITO: "VIII" > |
< NOVE: "IX" > |
< DEZ: "X" > |
< VINTE: "XX" > |
< TRINTA: "XXX" > |
< QUARENTA:"XL" > |
< CINQUENTA:"L" > |
< SESSENTA:"LX" > |
< SETENTA: "LXX" > |
< OITENTA: "LXXX" > |
< NOVENTA: "XC" > |
< CEM: "C" > |
< DUZENTOS: "CC" > |
< TREZENTOS: "CCC" > |
< QUATROCENTOS: "CD" > |
< QUINHENTOS : "D" > |
< SEISCENTOS: "DC" > |
< SETECENTOS: "DCC" > |
< OITOCENTOS: "DCCC" > |
< NOVECENTOS: "CM" > |
< MIL: "M" > |
< DOISMIL: "MM" > |
< TRESMIL: "MMM" >
}
LinkedList
{
( com = linhaComando()
{
listaComandos.add(com);
}
)*
{
return listaComandos;
}
}
Comando linhaComando() : {Comando com;}
{
com = comando()
{
return com;
}
}
Comando comando() : {Comando com;}
{
(
com = exibe()
|
com = atribui()
)
{
return com;
}
}
Comando exibe() : {Comando com; Token t;}
{
{
com = new Comando('E',t.image,"");
return com;
}
}
Comando atribui() : {Simbolo simb; Token t; LinkedList
{
t=
{
simb = new Simbolo(t.image);
tabela.inclui(simb);
}
{
//System.out.println(listaExp);
com = new Comando('A',t.image,listaExp);
return com;
}
}
LinkedList
{
item = fator()
{
listaExp.add(item);
}
(
{
listaExp.add(item);
listaExp.add(new Item('o',"+"));
}
)*
{
return listaExp;
}
}
Item fator() : {Token t;Item item = null; int valorNumero;}
{
t =
{
if(!tabela.isExiste(t.image))
System.out.println("Erro semântico \n A variável "+t.image+
" não foi inicializada");
item = new Item('v',t.image);
return item;
}
|
valorNumero = numero()
{
item = new Item('n',""+valorNumero);
return item;
}
}
int numero() : {int valorUnidade = 0, valorDezena = 0, valorCentena = 0, valorMilhar = 0;}
{
(
valorMilhar = milhar() (valorCentena = centena())? (valorDezena = dezena())? ( valorUnidade = unidade() )?| valorCentena = centena() (valorDezena = dezena())? ( valorUnidade = unidade() )?| valorDezena = dezena() ( valorUnidade = unidade() )? | valorUnidade = unidade()
)
{
return valorMilhar + valorCentena + valorDezena + valorUnidade;
}
}
int unidade() : {}
{
}
...