• Publicidad

Nuevo en Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Nuevo en Perl

Notapor SombraUO » 2007-11-11 16:30 @729

Muy buenas a tardes a todos los foristas, antes que nada felicitar a los moderadores y administradores por este portal tan útil para el lenguaje Perl.

Soy estudiante Universitario, actualmente curso 5º semestre de informática.

Un profesor de la cátedra lenguajes de programación propuso el siguiente ejercicio:

Se requiere de sus buenos oficios para la implementación en Perl de un intérprete para MiX, lenguaje sencillo con soporte de declaraciones de variables, asignación, salto explícito, operaciones aritméticas básicas y comentarios con #. El lenguaje usa solo mayúsculas, pero no toma en cuenta los espacios en blanco. La secuencia de instrucciones a interpretar será cargada automáticamente desde un archivo llamado TESTn.MiX. Las instrucciones del lenguaje son:
  • DEF v: Declara v como una variable entera, v debe ser solo letras, pueden declararse n variable.
  • SET v y: asigna el número entero (o variable) “y” a la variable “v”.
  • + v y: suma la variable “v” con el número entero (o variable) “y”. El resultado se almacena en “v”.
  • - v y: resta la variable “v” con el número entero (o variable) “y”. El resultado se almacena en “v”.
  • * v y: multiplica la variable “v” con el número entero (o variable) “y”. El resultado se almacena en “v”.
  • / v y: divide la variable “v” con el número entero (o variable) “y”. El resultado se almacena en “v”.
  • LABEL i: establece una etiqueta, i debe ser un número entre 1 y 999
  • < v y i: Si la variable v es menor que el número entero (o variable) “y”, saltar a la etiqueta i.
  • > v y i: Si la variable v es mayor que el número entero (o variable) “y”, saltar a la etiqueta i.
  • = v y i: Si la variable v es igual que el número entero (o variable) “y”, saltar a la etiqueta i.
  • ! v y i: Si la variable v es diferente que el número entero (o variable) “y”, saltar a la etiqueta i.
  • GO i: salta a la etiqueta i.
Dado como entrada automática un archivo que contiene un programa escrito en MiX, usted deberá:
  1. Interpretar el programa completo.
  2. Generar un archivo de resultados llamado MiX.xml que contenga:
    1. Nombre del archivo interpretado, con la cantidad de líneas de código que posee.
    2. Las variable declaradas con su respectivo valor al culminar la interpretación.
    3. Cantidad de operaciones aritméticas que fueron efectuadas, por operación.
    4. Cantidad de saltos efectuados (condicionales o explícitos).

Código: Seleccionar todo
Ejemplo: el siguiente programa MiX calcula el factorial de 4:
DEF A B C    #declaración de 3 variables A,B y C
#inicialización de variable
SET A 4 #  A=4
#la inicialización a cero no es necesaria si el interprete lo hace automáticamente
SET B 0
SET C 1
#
# aquí comienza un ciclo
LABEL 1
+ B 1   #B = B +1
* C B   #C = C*B
< B A 1   #mientras (B<A) saltar a la etiqueta LABEL 1

END


No pretendo que me resuelvan el problema :P, pero sí me echen una mano, ya que no conozco el lenguaje en lo absoluto, pero sí he programado bastante en otros lenguajes, así que manejo un poco la terminología de programación.

El análisis del problema que el profesor dio, pues es bastante evidente, no hay interacción con el usuario en lo absoluto, simplemente se va a interpretar un lenguaje (MiX: lenguaje inventado por el profesor) y se va a emitir una hoja de reportes en .xml con la exigencias antes planteadas.

Hasta el momento solo he podido leer un archivo de texto, he podido separar línea por línea dicho archivo y almacenar su contenido en arreglos.

Cualquier ayuda es bien recibida, yo tengo que entregar este trabajo el viernes, pero de no poder terminarlo a tiempo, igualmente quiero resolverlo, me parece que es un problema bastante completo y que me permitirá familiarizarme con Perl, ¡el cual me parece un lenguaje bastante amplio e interesante!... sin más que agregar ¡me despido!


¡Mis respetos!
SombraUO
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-11-11 16:13 @717

Publicidad

Notapor Norther » 2007-11-11 16:41 @736

Yo tampoco sé mucho de Perl pero te recomendaría el libro Learning Perl de O'Reilly.

A mí personalmente me gusta mucho.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-11-11 22:10 @965

Me parece muy interesante el problema.

Aquí hay un principio de lo que puede ser. Se trata de pasar de lenguaje MiX a lenguaje Perl, para luego ejecutarlo fácilmente.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#
# Compilador e intérprete de lenguaje MiX.
#
# Joaquín Ferrero. 20071112 02:30 - 04:00
#
# Este compilador generará una versión Perl del programa MiX pasado su nombre
# como primer argumento. Luego lo ejecuta.
#

use strict "vars";
use warnings;

@ARGV or die "ERROR: Hay que indicar el fichero con el programa Mix a compilar";

my $programa = '';
my $fichero  = shift @ARGV;

open FICHERO, "<$fichero" or die "ERROR: No puedo abrir el fichero $fichero\n";

;
while ( <FICHERO> ) {
    chomp;                              # Quitamos final de línea

    s/ \s* \# .* //x;                   # Quitamos comentarios

    next if /^$/;                       # Seguimos si es línea en blanco

    $_ = uc;                            # Pasamos a mayúsculas

    my ( $op, @argv ) = split " ", $_;  # Separamos entre operador y argumentos

    last if $op eq 'END';               # Fin del programa

    #print "$op=@argv\n";

    my $sentencia = '';                 # Aquí crearemos la sentencia

    if ( $op =~ m{[+*/-]} ) {           # Operación matemática
        $sentencia = MAT($op,@argv);
    }
    elsif ( $op =~ m{[<>=!]} ) {        # Operaciones lógicas
        $sentencia = LOGIC($op,@argv);
    }
    elsif ( $op eq '?' ) {              # Impresión
        $sentencia = PRINT(@argv);
    }
    else {                              # Todo lo demás
        $sentencia = &$op(@argv);
    }

    $programa .= "$sentencia;\n";
}
close FICHERO;

print "$programa\n";                    # Programa Perl resultado

eval $programa;                         # Lo ejecutamos


sub a_variable {                        # Nos pasa a variable el argumento
    $_[0] =~ s/([A-Z]+)/\$$1/g;         # solo si son caracteres
}
sub MAT   {                             # Operaciones matemáticas
    a_variable($_[2]);
    "\$$_[1] $_[0]= $_[2]"
}
sub LOGIC {                             # Operaciones lógicas
    a_variable($_[2]);
    $_[0] =~ s/=/eq/;                   # Casos excepcionales
    $_[0] =~ s/!/ne/;
    "goto L$_[3] if \$$_[1] $_[0] $_[2]"
}
sub DEF   {                             # Declaración de variables
    'my (' . join(q{,}, map { "\$$_" } @_) . ')';
}
sub SET   {                             # Definición de variables
    a_variable($_[1]);
    "\$$_[0] = $_[1]";
}
sub LABEL {                             # Etiquetas
    "L$_[0]:";
}
sub PRINT {                             # Impresión
    'print "' . join($", map { a_variable($_); $_ } @_) . '\n"';
}

__END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Esto es algo que no tienen otros lenguajes: crear código y ejecutarlo dentro del propio programa.

Le he añadido a la definición el operando '?' para que imprima el valor de los argumentos que le siguen.

No lo he probado mucho, así que tendrá errores. Al menos, con el programa de ejemplo, funciona.

Lo que tampoco tiene son las estadísticas que el ejercicio solicita ni control de errores de sintaxis... pero... no es cuestión de hacerlo todo, ¿no?

Hay otras formas de hacerlo. Dispatch-tables, parser (definir una gramática), ejecución paso a paso...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

RE:

Notapor SombraUO » 2007-11-11 22:19 @972

Está excelente la ayuda, muchas gracias, sobre todo con las llamadas a las funciones, que aun no podía hacerlas, de hecho ya tengo algunos procedimientos listos, pero de manera secuencial, lo que me tiene preocupado es la creación del archivo .xml ¿conoces algo de eso?, he leído acerca de un modulo xml::simple pero no logro ver un buen ejemplo al momento de crear y escribir.

Creo que al paso que voy está listo antes del miércoles Dios mediante :D!

¡Saludos!
SombraUO
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-11-11 16:13 @717


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados