• Sábado 21 de Septiembre de 2024, 16:47

Autor Tema:  Programar automata  (Leído 2809 veces)

cypres_snk

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Programar automata
« en: Viernes 26 de Marzo de 2010, 23:25 »
0
Bueno pues hace 4 dias me dejaron un programa qeu lo que tengo qeu hacer es ingresar una expresión regular y me tiene que imprimir su tabla de transiciones. Ando pensando como hacerle pero sigo sin ideas no busco qeu me pasen el programa resuelto sino algun libro o pagina donde venga ejemplos para programar algo asi o alguna informacion seria de mucha ayuda.
Un ejemplo seria meter la expresión:    (a|b)ab*
y me imprima la tabla:
           a       b
A        B       B
B        B       Z
que serian los conjutos creados después de sacar primerapos, ultimapos y siguientepos y de hay crearía mis conjuntos. Espero haberme explicado bien.

Lo qeu todavia no entiendo bien para manejar las posiciones e imprimir la tabla ya qeu todo el proceso lo hago por un dibujo de un automata o ya sea un arbol de un automata
Lo que en si tengo qeu hacer sacar el primerapos, ultimapos y siguientepos; y ya de ahy crear los conjuntos pero el problema es lo mismo no le entiendo muy bien como manejar las posiciones del automata aunqeu la logica para sacar el PP UP y SP si;

Tengo pensado poner una varibale N qeu sea el nodo, C1 qeu seria la hoja izquierda, C2 la hoja derecha, una PP qeu seria primerapos, una UP que seria ultimapos y otra SP qeu seria siguientepos.
la Logica que tengo que si tengo un or(|) N=C1UC2 -->c1 union c2;
si tengo una estrella(*) N=C1 (que seria su unica hoja).
Y si tengo un and(•) se haria algo como lo siguiente:
Para sacar PP(Primerapos):
if(C1==true)
{
PP=C1UC2; //Indico que si c1 es anulable(una estrella *) la PP seria la union de las hojas
PP=N; //Hago PP igual al nodo para indicar donde se guarda PP
}
else
{
PP=C1;
PP=N
}
Para sacar UP(Ultimapos)
if(c2==true)
{
UP=C12UC2;
UP=N
}
else
{
UP=C2;
}
Y Para sacar SP(Siguientepos)
if(N=='*')
{
UP[N]=PP[N]; //Si el nodo es un * a la ultimapos del nodo le guardo la primerapos del mismo nodo
}
if(N=='•')
{
UP[C1]=PP[C2]; //Si el nodo es un and • a la ultimapos de su hoja izq le gurdo el valor de la primerapos de su hoja derecha
}

y todo lo manejaria con pilas
pero no se como acomodar mi codigo ya que no eh trabajado mucho con programas como en los if qeu tengo N==* y N==• no tengo idea como acomodarlo si podria ser pro posiciones (PILAS) y manejarlas como true y false o como.
Cualquier idea bienvenida
De antemano gracias

bueno siguiendo buscando y pensandole llebo este codigo:
import java.io.*;
public class Automata
{
 static int c1,c2;
 public static void main(String arg[])throws IOException
 {
  String er;  //Variable para mi expresion regular
  int cont=0;  //variable para contar las concatenaciones de la expresion regular
  int pp,up,sp;  //declaro variables primerapos, ultimapos, siguientepos
  int c1,c2;    //declaro dos variables para manejar las hojas del nodo
  //char alf[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','ñ','o','p','q','r','s','t','u','v','w','x','y','z'};
  BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  System.out.println("Ingrese Expresion Regular");
  er=br.readLine();
  try
  {
   if(er.charAt(0)!='a' || er.charAt(0)!='b')
   {
    System.out.println("Expresion regular incorrecta");
   }
  }
  catch(){}
  for(int i=0; i<er.length(); i++)
  {  
    if(er.charAt(i)=='a' || er.charAt(i)=='b')  
   {
    cont++;         //contabiliso el numero de letras de la expresion para saber cuando nodos de concatenacion tendra el automata
   }
   if(er.charAt(i)=='|')
   {
    cont--;        //si la expresion tiene un | disminuye uno ya qeu es uno u otro pero no ambos
   }
  }
  int Nodo[]=new int[cont];   //la longitud del arreglo es el numero de caracteres de mi variable er
 
 
 
 }
}    

lo qeu voy haaciendo es contar el numero de concatenaciones qeu pueda tener mi expresion para saber por cuantos nodos me tengo qeu mover nomas qeu una de mis dudas es como le voy a hacer para moverme entre los nodos y manejar las "hojas" de cada nodo, ya que es una simulacion de un arbol... Mis hojas seria c1 y c2 recuerdo algo como hacerle Nodo.c1 y Nodo.c2 pero no logro saber como programarlo.
Saludos y gracias nuevamente