Isso aí é uma necessidade que surgiu na aula de linguagens formais ou compiladores?
Se for… melhor estudar o material que seu professor sugeriu, em especial na parte de análise léxica e sintática.
Se não for, dê uma olhada em APIs prontas para isso, como o AntLR, ou alguma que avalie a expressão diretamente.
R
rsom91
vinni godoy…
é porque eu preciso criar um programa em java que faça conversao de uma expressao pos-fixada para infixada e vice-versa.
o problema que e aula de estrtura de dados entao preciso usar uma TAD pilha para fazer a conversao.
essa TAD pilha foi implementada por mim.
mas nao to conseguindo passar a expresao de maneira que teria como eu manipular ela na pilha. entendeu?
ViniGodoy
Basta acumular o número, até que você encontre um símbolo.
Veja se o algoritmo abaixo ajuda:
String numero = ""
para cada caracter na string
inicio
Se for um número
Numero = numero + simbolo;
Senão Se for um símbolo matemático
inicio
Processe o simbolo com a pilha
Armazene de alguma forma o numero
Numero = ""
fim
fim
R
rsom91
publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));Stringexp2;System.out.println("Informe a expressao:");Stringentrada=in.readLine();exp2=removeSpaces(entrada);System.out.println(exp2);}publicstaticStringremoveSpaces(Strings){StringTokenizerst=newStringTokenizer(s," ",false);Stringt="";while(st.hasMoreElements())t+=st.nextElement();returnt;}
retiro os espaços. depois teria como eu percorrer a string?
o problema e que pra expressao infixada funciona aquilo que vc disse, mas se ele informar uma do tipo pos-fixada ja nao funcionaria. esse e o grande problema.
ViniGodoy
Oi.
Primeiro de tudo. Se você ler o javadoc da StringTokenizer, vai ver que a própria classe diz que não deve ser mais usada, e que você deve usar split no lugar.
Mas vai aí um código que faz o que você precisa:
importjava.util.ArrayList;importjava.util.List;publicclassTeste{publicstaticString[]parseExpression(Stringexpression){List<String>parsed=newArrayList<String>();StringBuildernumber=newStringBuilder("");for(charch:expression.toCharArray()){//Se for um número, acumula os caracteres numa String.if(Character.isDigit(ch)||ch=='.'){number.append(ch);continue;}//Se não for um número, então adiciona o número acumulado na Stringif(number.length()>0){parsed.add(number.toString());number=newStringBuilder("");}//Se for um espaço ou tab, não considera como operação matemáticaif(ch==' '||ch=='\t'){continue;}//Outros símbolos, considere como operação matemática.parsed.add(Character.toString(ch));}//Como acima os números só foram adicionados quando símbolos foram encontrados//Precisamos testar se não sobrou um último número sem um simbolo após ele.if(number.length()>=0){parsed.add(number.toString());}//Retorna os valores acumulados, na forma de um array de Strings.returnparsed.toArray(newString[parsed.size()]);}publicstaticvoidmain(String[]args){System.out.println("Infixa");for(Stringstr:parseExpression("(12 + 4) * 15.45")){System.out.println(str);}System.out.println("Posfixa");for(Stringstr:parseExpression("12 4 5.34 + -")){System.out.println(str);}}}
R
rsom91
muito obrigado …
desculpa por ser tao iniciante…
e quanto a API nao domino muito o ingles nao…
grato!
ViniGodoy
rsom91:
muito obrigado …
desculpa por ser tao iniciante…
e quanto a API nao domino muito o ingles nao…
Não precisa pedir desculpa. Só não peça para eu entregar também o conversor. Esse trabalho é seu (eu já fiz um desse em 1997, pra escola).
E, quando terminar e tiver funcionando, volta aqui no tópico e posta a solução.
R
rsom91
nem pensar o conversor ja tenho o algoritmo desenhado…agora so programar, o que estou fazendo agora.
depois posto sim…mas o codigo? ou o .jar?