Foros del Web » Programación para mayores de 30 ;) » Programación General »

Compiladores

Estas en el tema de Compiladores en el foro de Programación General en Foros del Web. me gusta el foro no sabia donde poner este tema, tonces decidí ponerlo aqui http://www.delegacion-fic.udc.es/?q=node/45#comment-553 de este sitio te puedes bajar la documentación el siguiente ...
  #1 (permalink)  
Antiguo 01/06/2005, 00:22
Avatar de Jorgemen  
Fecha de Ingreso: mayo-2005
Ubicación: Perú
Mensajes: 322
Antigüedad: 19 años
Puntos: 1
Compiladores

me gusta el foro no sabia donde poner este tema, tonces decidí ponerlo aqui
http://www.delegacion-fic.udc.es/?q=node/45#comment-553 de este sitio te puedes bajar la documentación el siguiente programa se trata de un automata finito no determinista(AFN), este código determina si entrado un número real es este un real (realmente!) o no. este es un ejemplo de un AFN que es una herramientas especializada que ayuda a automatizar la construcción de analizadores léxicos y analizadores sintácticos que estos a su vez forman parte de la construcción de un compilador
Código PHP:
<?php 
class AFN_real
{
    var 
$actual;//POSICION del arreglo que se esta utilizando
    
function mover($s,$c)
    {
        if(
$s==1)
        {
            if((
$c=="-")or($c=="+"))        
                
$s=2;
            elseif((
48<=ord($c))and(ord($c)<=57))            
                
$s=3;
            else                 
                
$s=6;
        }
        elseif(
$s==2)
        {
            if((
49<=ord($c))and(ord($c)<=57))        
                
$s=3;
            elseif(
$c=="0")            
                
$s=2;
            else                    
                
$s=6;                        
        }
        elseif(
$s==3)
        {
            if(
$c==".")
                
$s=4;
            elseif((
48<=ord($c))and(ord($c)<=57))    
                
$s=3;
            else                
                
$s=6;
        }
        elseif(
$s==4)
        {
            if((
48<=ord($c))and(ord($c)<=57))        
                
$s=5;
            else                
                
$s=6;
        }
        elseif(
$s==5)
        {
            if((
48<=ord($c))and(ord($c)<=57))        
                
$s=5;
            else
                
$s=6;
        }
        return 
$s;
    }
    function 
verificar($numero)
    {
        
$lon=strlen($numero);
        
$s=1;            //inicializo el estado s en el primer estado que es 1
        
$c=$numero[0];     //saca el primer elemento del número
        
$this->actual=0;
        
$co="";
        while ((
$co<>$numero)and($s<>6))
        {
            
$co=$co.$c;
            
$s=$this->mover($s,$c);
            
$this->actual++;
            if (
$this->actual<$lon)
            {
                
$c=$numero[$this->actual];
            }
        }
        if(
$s==5)
            return 
true;
        else
            return 
false;
    }
}
// fin de clase
$numero=$_POST["edNumero"];
$afn=new AFN_real;
if(
$afn->verificar($numero))
    echo 
"si es";
else
    echo 
"no es";
?>
interfaz
Código HTML:
<form name='form1' method='post' action='AFN_real.php'>
              <p align="center"><span class="Estilo1">Ingrese N&uacute;mero real a verificar</span><span class="Estilo5"> :</span><br> 
                <br><input type='text' name='edNumero'>
                  <br><br><input type="submit" name="Submit" value="Enviar"> </p>
            </form> 
  #2 (permalink)  
Antiguo 01/06/2005, 00:48
Avatar de Jorgemen  
Fecha de Ingreso: mayo-2005
Ubicación: Perú
Mensajes: 322
Antigüedad: 19 años
Puntos: 1
Aqui va otro ejemplo, valida que las variables ya sean por valor o referencia empiecen siempre con una letra y que los sigueentes sean números, _ , o letras; como esta echo con clases podría reutilizarse el método verificar por ser este el mismo para ambos, solo cambiaría en si el diagrama de estados por ente el método mover
Código PHP:
<?php 
class AFN_cadena
{
    var 
$actual;//POSICION del arreglo que se esta utilizando
    
function mover($s,$c)
    {
        if(
$s==1)
        {
            if((
97<=ord($c))and(ord($c)<=122))        
                
$s=2;
            else
                
$s=3;
        }
        elseif(
$s==2)
        {
            if((
97<=ord($c))and(ord($c)<=122)or((48<=ord($c))and(ord($c)<=57))or($c=="_"))        
                
$s=2;
            else                    
                
$s=3;                        
        }
        return 
$s;
    }
    function 
verificar($cadena)
    {
        
$lon=strlen($cadena);
        
$s=1;            //inicializo el estado s en el primer estado que es 1
        
$c=$cadena[0];     //saca el primer elemento del número
        
$this->actual=0;
        
$co="";
        while ((
$co<>$cadena)and($s<>6))
        {
            
$co=$co.$c;
            
$s=$this->mover($s,$c);
            
$this->actual++;
            if (
$this->actual<$lon)
            {
                
$c=$cadena[$this->actual];
            }
        }
        if(
$s==2)
            return 
true;
        else
            return 
false;
    }
}
// fin de clase
$cadena=$_POST["edCadena"];
$afn=new AFN_cadena;
if(
$afn->verificar($cadena))
    echo 
"esta bien";
else
    echo 
"esta mal";
  #3 (permalink)  
Antiguo 01/06/2005, 00:53
Avatar de Jorgemen  
Fecha de Ingreso: mayo-2005
Ubicación: Perú
Mensajes: 322
Antigüedad: 19 años
Puntos: 1
El primer ejemplo pero en codigo C# para consola
using System;
Código PHP:
namespace compiladores_1
{

    class 
AFN_real
    
{
        
int actual;//almacena la posición del arreglo que se esta utilizando
        //var $arreglo;
        
public int mover(int s,char c)
        {
            if(
s==1)
            {
                if((
c=='-')||(c=='+'))s=2;
                else if((
System.Convert.ToInt16(c)>=48)&&(System.Convert.ToInt16(c)<=57))s=3;
                else 
s=6;
            }
            else if(
s==2)
            {
                if((
System.Convert.ToInt16(c)>48)&&(System.Convert.ToInt16(c)<=57))s=3;
                else if(
c=='0')s=2;
                else 
s=6;                        
            }
            else if(
s==3){
                if(
c=='.')s=4;
                else if((
System.Convert.ToInt16(c)>=48)&&(System.Convert.ToInt16(c)<=57))s=3;
                else 
s=6;
            }
            else if(
s==4){
                if((
System.Convert.ToInt16(c)>=48)&&(System.Convert.ToInt16(c)<=57))s=5;
                else 
s=6;
            }
            else if(
s==5){
                if((
System.Convert.ToInt16(c)>=48)&&(System.Convert.ToInt16(c)<=57))s=5;
                else 
s=6;
            }
            return 
s;
        }
        public 
bool verificar(string numero)
        {
            
int lon=numero.Length//longitud de un numero
            
int s=1;            //inicializo el estado s en el primer estado que es 1
            
char c=numero[0];     //saca el primer elemento del número
            
this.actual=0;
            
string con="";
            while ((
con!=numero)&&(s!=6))
            {
                
con=con+c;
                
s=this.mover(s,c);
                
this.actual++;
                if (
this.actual!=lon)
                    
c=numero[this.actual];
            }
            if(
s==5)
                return 
true;
            else
                return 
false;
        }
    }
// fin de clase
    
class inicio
    
{
        
        static 
void Main(string[] args)
        {
            
Console.WriteLine("Digite número");
            
string numero=Console.ReadLine();
            
int a=System.Convert.ToInt16('c');
            
AFN_real afn=new AFN_real();
            if(
afn.verificar(numero))
                
Console.WriteLine("si es un número real");
            else
                
Console.WriteLine("no es un número real");
            
inicio.Main(args);    
        }
    }

  #4 (permalink)  
Antiguo 01/06/2005, 04:25
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Critica constructiva: usa switch ... case en lugar de los if (s==1) else if (s==2) else ...
  #5 (permalink)  
Antiguo 01/06/2005, 06:36
Avatar de Jorgemen  
Fecha de Ingreso: mayo-2005
Ubicación: Perú
Mensajes: 322
Antigüedad: 19 años
Puntos: 1
gracias

si, bueno case es incomodo para mi siempre nos enseñaron eso diciendo que es más comodo pero igual me da cosas usarlo, en realidad son equivalentes, por eso se creo elseif para los que nos gusta el if else pero de todas maneras gracias
  #6 (permalink)  
Antiguo 01/06/2005, 15:28
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
En realidad el codigo generado no es equivalente y la verdad es que no entiendo muy bien el titulo del hilo ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 01/06/2005, 15:58
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por Eternal Idol
la verdad es que no entiendo muy bien el titulo del hilo ...
un AFND es parte de la teoria que se da en la materia de compiladores y se supone que es la base de como formar un lenguaje, en su parte lexica , lo cual es usado para crear un compilador..........

Lo que no entiendo bien es el tema en si.....se supone que es para brindar codigo?, ayudar?, tiene algun problema?
  #8 (permalink)  
Antiguo 01/06/2005, 16:06
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por blackwind
un AFND es parte de la teoria que se da en la materia de compiladores y se supone que es la base de como formar un lenguaje, en su parte lexica , lo cual es usado para crear un compilador..........

Lo que no entiendo bien es el tema en si.....se supone que es para brindar codigo?, ayudar?, tiene algun problema?
Eso ya esta dicho en el primer post y siguiendo esa logica yo pondria un titulo de 'Juegos en 2D' para un ejemplo sobre como graficar un punto ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:27.