Estou desenvolvendo um programa para resolver o metodo de thompson(automatos), e preciso quebrar uma expressao regular respeitando as precedencia dos operadores de concatenacao, alternacao e klincogeno(axo q excreve assim).
alguem tem esse codigo implementado? nao estou conseguindo desenvolver.
olha cara, isso é muito particular, e dificilmente alguem vai implementar pra ti…
agora… se vc, que esta com o conhecimento do negocio, começar a fazer e si complicar em alguma coisa com java… tipo, como fazer alguma coisa com String, posta que fica mais facil…
de qualquer forma, tenta ai… e vai postando os problemas, por partes…
[]'s
_
_g4br1elPJ
tipo, tenho uma expressao regular do tipo : -> (a+b).c*
tenho que quebrar essa string, observando os parenteses e tb a precedencia de cada operador.
como vou fazer isso? n tenho a minima ideia.
entendeu?
D
DirkPJ
"_g4br1el":
tipo, tenho uma expressao regular do tipo : -> (a+b).c*
tenho que quebrar essa string, observando os parenteses e tb a precedencia de cada operador.
como vou fazer isso? n tenho a minima ideia.
entendeu?
Vc que um algortimo que verifique se uma determinada expresão regular respeita uma lei de formação dada, não eh ??? Tipo assim, se a lei de formação é (a+b).c*, pode-se derivar dessa expressão diversas outras tais como :
Ai vc que um algoritmo que verifique se essas expressões derivadas respeitam a lei de formação !!
Sua duvida eh essa ??
_
_g4br1elPJ
assim nao!
tipo, eu tenho a seguinte expressao regular: (a+b).c + d.(e+f)
sendo: + = operador de alternacao
. = operador de concatenacao
* = klincogeno(repeticao)
tenho que gerar um automato finito nao deterministico a partir dessa expressao, soh que tenho que respeitar as procedencias… pq o que esta entre ( ) deve ser resolvido primeiro, depois os *, e depois os . e +
entendeu ?
V
vieciliPJ
Neste caso a última coisa q vc deve fazer é ir direto pra codificação, primeiro faça um modelo de grafos que represente teu autômato (nós = estados; linhas = transições) defina teus estados e as transições entre estados.
Só depois disso feito vc vai ir pra codificação, podendo usar algum algoritmo recursivo pra representar a tua máquina de estatos finitos.
E
ErkoPJ
eu fiz isso esse final de semana… :razz:
mas naum utilizei letras eu fiz com reconhecimento de numeros mesmo…
analise de notação infixa gerando notação pós-fixa e uma estrutura de lista
com cada componente da notação põsfixa
talvez te ajude a ter alguma ideia
ps.: observar o método convertToPostfix()
que analisa a expressão
segue o código
importjava.util.LinkedList;/** * Classe que recebe uma expressão matemática e infixa Ex.: (6+2)*3 * e a converte para uma notação pós - fixa -> 6 2 + 3 * * * @author <a href="mailto:[email removido]">Erko Bridee de Almeida Cabrera</a> */publicclassInfixToPostfix{/*------------------------------------------------------------------------* * Declaração das variáveis da classe *------------------------------------------------------------------------*//** * <code>notacaoPosFixa</code> - * estrutura da notação pós-fixa em uma estrutuda de lista */privateLinkedListnotacaoPosFixa;/** pilha para auxiliar na conversão */privatePilhapilha;/** notação infixa a ser convertida */privateStringinfix;/** resultado, notação pós-fixa */privateStringpostfix;/*------------------------------------------------------------------------* * Fim Declaração das variáveis da classe *------------------------------------------------------------------------*//*------------------------------------------------------------------------* * Construtores da classe *------------------------------------------------------------------------*//** Construtor sem parametros da classe */publicInfixToPostfix(){// inicializa pilhathis.setPilha(newPilha());// inicializando estrutura que armazena a notação pós-fixa como listathis.setNotacaoPosFixa(newLinkedList());// inicializa em vazia a notação infixathis.setInfix("");// inicializa em vazia a notação pós-fixathis.setPostfix("");}/** * Construtor da classe que recebe como parametro * a notação infixa a ser convertida * * @param String infix */publicInfixToPostfix(Stringinfix){// inicializa pilhathis.setPilha(newPilha());// inicializando estrutura que armazena a notação pós-fixa como listathis.setNotacaoPosFixa(newLinkedList());// repassa notação infixathis.setInfix(infix);// inicializa em vazia a notação pós-fixathis.setPostfix("");// chama método de conversãothis.convertToPostfix();}/*------------------------------------------------------------------------* * Fim Construtores da classe *------------------------------------------------------------------------*//*------------------------------------------------------------------------* * Métodos de acesso a variáveis da classe *------------------------------------------------------------------------*//** * @return Pilha pilha. */publicPilhagetPilha(){returnpilha;}/** * @param Pilha pilha. */publicvoidsetPilha(Pilhapilha){this.pilha=pilha;}/** * @return String postfix. */publicStringgetPostfix(){returnpostfix;}/** * @return LinkedList notacaoPosFixa. */publicLinkedListgetNotacaoPosFixa(){returnnotacaoPosFixa;}/** * @param LinkedList notacaoPosFixa. */publicvoidsetNotacaoPosFixa(LinkedListnotacaoPosFixa){this.notacaoPosFixa=notacaoPosFixa;}/** * @param String postfix. */publicvoidsetPostfix(Stringpostfix){this.postfix=postfix;}/** * @return String infix. */publicStringgetInfix(){returninfix;}/** * @param String infix. */publicvoidsetInfix(Stringinfix){this.infix=infix;}/*------------------------------------------------------------------------* * Fim Métodos de acesso a variáveis da classe *------------------------------------------------------------------------*//*------------------------------------------------------------------------* * Serviços da classe *------------------------------------------------------------------------*//** * Método que converte de notação infixa para pós-fixa * * @param String infix - notação infixa */publicvoidconvertToPostfix(Stringinfix){this.setInfix(infix);this.convertToPostfix();}/** * Método que converte de notação infixa para pós-fixa */publicvoidconvertToPostfix(){Stringnumero="";for(inti=0;i<this.getInfix().length();i++){charc=this.getInfix().charAt(i);// vetificando parentesesswitch(c){// abrindo parentesescase'(':this.getPilha().push(""+c+"");break;/* * Fechando parenteses desempilha tudo até o fecha * parenteses */case')':if(numero.length()>0){this.addNu(numero);numero="";}while(!this.getPilha().isEmpty()){Stringop=this.getPilha().pop().toString();if(op.equals("(")){break;}this.addOp(op);}break;}// verificando númeroif(this.isNumPart(c)){numero+=""+c;}// verificando se é operadorif(this.isOperator(c)){this.addNu(numero);this.trataOperador(c);numero="";}if(i==this.getInfix().length()-1){this.addNu(numero);}}// se a pilha não estiver vazia desempilha operadorwhile(!this.getPilha().isEmpty()){Stringop=this.getPilha().pop().toString();if(op.equals("(")){break;}this.addOp(op);}}/** * Método que realiza as verificações necessárias sobre um * novo operador encontrado * @param c */privatevoidtrataOperador(charc){if(this.getPilha().isEmpty()){this.getPilha().push(""+c+"");this.newNu();}else{/* * verificando se o operador inserido na pilha tem * precedencia maior que o operador atual */if(this.precedence(""+c+"",this.getPilha().stackTop())){this.getPilha().push(""+c+"");this.newNu();}else{/* * enquanto a precedencia do operador for menor * do que os da pilha desempilha operador pilha * no final insere operador atual na pilha */while(true){if(!this.getPilha().isEmpty()){if(this.precedence(""+c+"",this.getPilha().stackTop())){this.getPilha().push(""+c+"");break;}}else{this.getPilha().push(""+c+"");break;}Stringop=this.getPilha().pop().toString();this.addOp(op);}}}}/** * novo número */privatevoidnewNu(){if(!this.getPostfix().endsWith(" ")){this.setPostfix(this.getPostfix()+" ");}}/** * concatena o número na notação pós-fixa * @param String nu */privatevoidaddNu(Stringnu){if(nu.length()>0){this.getNotacaoPosFixa().addLast(nu);this.setPostfix(this.getPostfix()+nu);}}/** * adiciona um operador na notação pós-fixa * @param op */privatevoidaddOp(Stringop){this.getNotacaoPosFixa().addLast(op);if(this.getPostfix().endsWith(" ")){this.setPostfix(this.getPostfix()+op+" ");}else{this.setPostfix(this.getPostfix()+" "+op+" ");}}/** * Método que avalia a precedencia dos operadores e retorna <b>true</b> * caso o operador1 tenha precedencia maior que operador2 * * @param Object operator1 * @param Object operator2 * @return boolean */privatebooleanprecedence(Objectoperator1,Objectoperator2){intvo1=this.operatorPrecedenceValue(operator1),vo2=this.operatorPrecedenceValue(operator2);if(vo1<vo2){returntrue;}returnfalse;}/** * Método que retorna o valor da pecedencia do operador * @param Object operator * @return int - valor de precedencia */privateintoperatorPrecedenceValue(Objectoperator){/* * ! = 0 - fatorial * ^ = 1 - exponenciação * * = 2 - multiplicação * / = 2 - divisão * % = 2 - operação de resto de divisão * + = 3 - soma * - = 3 - subtração */if(((String)operator).equals("!")){return0;}elseif(((String)operator).equals("^")){return1;}elseif(((String)operator).equals("*")){return2;}elseif(((String)operator).equals("/")){return2;}elseif(((String)operator).equals("%")){return2;}elseif(((String)operator).equals("+")){return3;}elseif(((String)operator).equals("-")){return3;}return4;}/** * Método que verifica um determinado caractere caso seja um operador * retorna <b>true</b>, se não retorna <b>false</b> * @param char c * @return boolean */privatebooleanisOperator(charc){switch(c){case'!':returntrue;case'^':returntrue;case'*':returntrue;case'/':returntrue;case'%':returntrue;case'+':returntrue;case'-':returntrue;}returnfalse;}/** * Método que verifica se um caractere faz parte de um número * se faz, retorna <b>true</b> * * @param char c * @return boolean */privatebooleanisNumPart(charc){switch(c){case'0':returntrue;case'1':returntrue;case'2':returntrue;case'3':returntrue;case'4':returntrue;case'5':returntrue;case'6':returntrue;case'7':returntrue;case'8':returntrue;case'9':returntrue;case'.':returntrue;}returnfalse;}/*------------------------------------------------------------------------* * Fim Serviços da classe *------------------------------------------------------------------------*/}
qq coisa nq eu puder ajudar é soh falar
[]´s
_
_g4br1elPJ
tipo, vou ver se simplifico aki:
vms supor que agente tem:
agente entra com esses valores: ( (4+3) * 6) + 5 * 9
e agente tem que mostrar a resposta dessa equacao, e sabemos que temos que resolver primeiro o que esta entre parenteses, depois a multiplicacao e por ultimo a soma…
como fariam isso?
meu problema eh quase isso.
aguardo