Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JnJ

Criando um compilador

Recommended Posts

Pessoal estou precisando criar um compilador java e meu código é o seguinte:

 

 

import java.awt.List;
import java.util.ArrayList;
public class PLP {
public static void main(String[] args) {
//String expressao = " 2 * (2+44*55)";
String expressao = "2*222-1";
Character quebra;
String lexeme = "";
int estado = 0;
ArrayList<String> tokens = new ArrayList<String>();
ArrayList<String> valores = new ArrayList<String>();
//Criar um array de inteiro
for (int i = 0; i < expressao.length(); i++) {
int j=i+1;
quebra = expressao.charAt(i);
// Console.WriteLine(quebra);
//correcao = expressao.charAt(j);
switch (estado) {
case 0:
if (Character.isDigit(quebra)) {
estado = 1;
lexeme = lexeme + quebra;
if(j == expressao.length()){
tokens.add("numero");
valores.add(lexeme);
System.out.println(lexeme);
}
} else if (quebra.equals('+')) {
tokens.add("Operador");
valores.add("+");
System.out.println(quebra);
} else if (quebra.equals('-')) {
tokens.add("Operador");
valores.add("-");
System.out.println(quebra);
} else if (quebra.equals('*')) {
tokens.add("Operador");
valores.add("*");
System.out.println(quebra);
} else if (quebra.equals('(')) {
tokens.add("Parentese");
valores.add("(");
System.out.println(quebra);
} else if (quebra.equals(')')) {
tokens.add("Parentese");
valores.add(")");
System.out.println(quebra);
}
break;
case 1:
if (Character.isDigit(quebra)) {
estado = 1;
lexeme = lexeme + quebra;
if(j == expressao.length()){
tokens.add("numero");
valores.add(lexeme);
System.out.println(lexeme);
}
} else if (Character.isSpaceChar(quebra)) {
tokens.add("numero");
valores.add(lexeme);
System.out.println(lexeme);
estado = 0;
// valor = Integer.parseInt(Character.toString(quebra));
lexeme = "";
} else {
tokens.add("numero");
valores.add(lexeme);
System.out.println(lexeme);
estado = 0;
// valor = Integer.parseInt(Character.toString(quebra));
lexeme = "";
i--;
}
break;
}
}
estado = 0;
for (int i = 0; i < tokens.size(); i++) {
System.out.println(tokens.get(i));
switch(estado)
{
case 0:
if(tokens.get(i) == "numero")
{
estado = 1;
}
else if(tokens.get(i) == "Parentese")
{
estado = 2;
}
else
estado = 99;
break;
case 1:
if(tokens.get(i) == "Parentese")
{
estado = 0;
}
else if(tokens.get(i) == "Operador")
{
estado = 0;
}
else
estado = 99;
break;
case 99:
System.out.println("Erro!");
}
}
//int a = Integer.parseInt("10");
int k=0, result=0, operacao = 0;
//int[] operacao = new int[valores.size()];
while(k < valores.size())
{
if(valores.get(k) == "*")
{
operacao = Integer.parseInt(valores.get(k-1));
result = operacao * Integer.parseInt(valores.get(k+1));
valores.remove(valores.get(k-1));
valores.remove(valores.get(k));
valores.remove("*");
//valores.remove(valores.get(k+1));
valores.add(Integer.toString(result));
System.out.println("Valor: "+result);
}
else if(tokens.get(k) == "+")
{
operacao = Integer.parseInt(valores.get(k-1));
result = operacao + Integer.parseInt(valores.get(k+1));
valores.remove(valores.get(k-1));
valores.remove(valores.get(k));
valores.remove("+");
//valores.remove(valores.get(k+1));
valores.add(Integer.toString(result));
System.out.println("Valor: "+result);
}
else if(tokens.get(k) == "-")
{
operacao = Integer.parseInt(valores.get(k-1));
result = operacao - Integer.parseInt(valores.get(k+1));
valores.remove(valores.get(k-1));
valores.remove(valores.get(k));
valores.remove("-");
//valores.remove(valores.get(k+1));
valores.add(Integer.toString(result));
System.out.println("Valor: "+result);
}
k++;
}
System.out.println("Here!");
for(int i = 0; i < valores.size();i++){
System.out.println(valores.get(i));
}
//System.out.println(valores.get(0));
}
}

 

Não estou conseguindo terminar a terceira parte que é a resolução da expressão, quem puder ajudar ficarei grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.