border

Miembros:
Mensajes:
Temas:
Online:

Ultimo Miembro:

 
 

  #1 (permalink)  
Antiguo 06-11-2006, 23:02:21
Un Nuevo Amigo
 
Registrado: oct 2006
Posts: 5
Silvia_Garcia Valoración +2
Contactar con Silvia_Garcia a través de MSN Contactar con Silvia_Garcia a través de Yahoo
Predeterminado compilador de tres lineas de pascal en VB6

Hola a Todos, Necesito ayuda estoy desarrollando un proyecto final en el cual tengo que entregar un compilador que simule a pascal en vb6, el compilador tiene que controlar en la primera line program, el nombre del programa y el punto y coma, el cual yo intente hacer.

en la segunda linea debe controlar la palabra cons, el nombre de la constante que sea diferente del nombre del programa, el signo de igual y el valor numerico de la constante y el punto y coma.

la tercera linea debe controlar la palabra var, el nombre de la variable(que este de be ser diferente al nombre de la constante y el nombre del programa), los dos puntos , el tipo de variable y el punto y coma.

le agradeceria su ayuda .... debo entregarlo a mas tardar el sabado.. soy novata y requiero de su ayuda.. gracias
aqui le envio lo que he hecho hasta ahora
postdata... en este no he podido controlar el nombre del prog
Archivos Adjuntos
Tipo de Archivo: zip compilador_1.0.zip (5,6 KB, 4 visitas)
__________________
Sigue siempre hacia adelante...
Responder Con Cita
  #2 (permalink)  
Antiguo 07-11-2006, 08:30:51
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.197
acalanto ha deshabilitado la reputación
Predeterminado

Para realizar un compilador de un determinado lenguaje, lo primero es crear un parser sintáctico de las sentencias recogidas en el código. Sinceramente es un tema en el que, una vez comprendida la mecánica de análisis, no es tan complejo de desarrollar, pero sí de escribir sin que tenga errores de detección y que pase cosas 'por alto'.

El siguiente paso sería 'linkar' todos los objetos y convertirlos a código binario (Entendible por el procesador) o a un BYTECODE o precompilado que pueda procesar un Framework (.NET), una máquina virtual (JAVA) o cualquier otro kernel creado por ti misma.

Copia este código en el formulario y si quieres puedes ampliar la función 'menmotecnicos' tanto como necesites. Así podrás compilar una, dos o doscientas líneas de código. Como ves, a pesar de que VB60 no es la mejor herramienta para desarrollar un compilador, se puede intentar.



Código:
Option Explicit

                Dim Data_Error As Integer
                Dim err_var As String
                
                'Segmentos de datos, código, pila y extra
                Dim ds()            As Variant
                Dim cs()            As String
                Dim ss()            As String
                Dim es()            As Variant
                
                'Punteros de base
                Dim bp              As String
                
                'Nombre programa
                Dim program         As String
                Dim devices         As String

Private Sub Mn_Salir_Click()
    End
End Sub
Private Sub Mn_Nuevo_Click()
    On Local Error Resume Next
    'Limpiamos consolas de código y mnemotécnicos
    Me.txtConsola.Text = ""
    Me.List1.Clear
End Sub
Private Function parse(lin As String) As String()
    Dim arr()       As String
    Dim prs()       As String
    Dim itms        As Long
    Dim mnt()       As String
    Dim mbp         As Integer
    On Local Error Resume Next
    'Eliminar tabulaciones y espacios
    Do Until InStr(lin, vbTab) = 0
        lin = Mid(lin, 1, InStr(lin, vbTab) - 1) + Mid(lin, InStr(lin, vbTab) + 1)
    Loop
    Do Until InStr(lin, " ") = 0
        lin = Mid(lin, 1, InStr(lin, " ") - 1) + Mid(lin, InStr(lin, " ") + 1)
    Loop
    'Desmembrar comandos de la línea
    itms = 0
    Do Until InStr(lin, ";") = 0
        itms = itms + 1
        ReDim Preserve arr(1 To itms)
        arr(itms) = Mid(lin, 1, InStr(lin, ";"))
        lin = Mid(lin, InStr(lin, ";") + 1)
    Loop
    If itms = 0 Then
        ReDim arr(1 To 1)
        arr(1) = lin
        parse = mnemotecnicos(arr())
    Else
        parse = mnemotecnicos(arr())
    End If
End Function
Private Sub Mn_Compilar_Click()
    Dim arr()           As String
    Dim cmds()          As String
    Dim i               As Long, j As Long
    Dim objetos         As Long
    Dim errores         As Long
    On Local Error Resume Next
    'Iniciar objetos
    program = ""
    devices = ""
    objetos = 0
    errores = 0
    Erase es
    Erase ds
    Erase ss
    Me.List1.Clear
    'Desmemmbrar líneas de texto
    arr = Split(Me.txtConsola.Text, vbCrLf)
    For i = LBound(arr) To UBound(arr)
        cmds = parse(arr(i))
        For j = LBound(cmds) To UBound(cmds)
            objetos = objetos + 1
            If Left(cmds(j), 3) = "ERR" Then
                errores = errores + 1
                Me.List1.AddItem "Error en línea: " + CStr(i) + " :: " + Mid(cmds(j), 4)
            Else
                If Trim(cmds(j)) <> "" Then Me.List1.AddItem cmds(j)
            End If
        Next j
        'por seguridad destruimos array
        Erase cmds
    Next i
    'Informa final
    Me.List1.AddItem " "
    Me.List1.AddItem " INFORME DE PARSER"
    Me.List1.AddItem " ================="
    If program = "" Then
        Me.List1.AddItem "PROGRAM:<falta nombre aplicación>"
    Else
        Me.List1.AddItem "PROGRAM:" + program
        If devices = "" Then
            Me.List1.AddItem "DISPOSITIVOS:<ninguno>"
        Else
            Me.List1.AddItem "DISPOSITIVOS:" + devices
        End If
    End If
    Me.List1.AddItem "Objetos procesados: " + CStr(objetos)
    Me.List1.AddItem "Errores: " + CStr(errores)
End Sub

Private Function mnemotecnicos(arr() As String) As String()
    Dim m()         As String
    Dim mns         As Long
    Dim i           As Long
    Dim ptr         As Long
    On Local Error Resume Next
    mns = 0
    For i = LBound(arr) To UBound(arr)
        mns = mns + 1
        ReDim Preserve m(1 To mns)
        If InStr(arr(i), ";") = 0 Then
            'SENTENCIAS SIN TERMINADOR
            If Left(arr(i), 1) = "{" Or Left(arr(i), 2) = "{*" Then
                m(mns) = "[COMENTARIO]            "
            ElseIf Left(LCase(arr(i)), 3) = "if(" Then
                m(mns) = "[IF        ]"
                m(mns) = m(mns) + Mid(arr(i), 4)
                m(mns) = Left(m(mns), Len(m(mns)) - 1)
            ElseIf Left(LCase(arr(i)), 5) = "endif" Then
                m(mns) = "[ENDIF      ]"
            ElseIf Left(LCase(arr(i)), 7) = "elseif(" Then
                m(mns) = "[ELSEIF    ]"
            ElseIf Left(LCase(arr(i)), 7) = "program" Then
                If InStr(arr(i), "(") <> 0 Then
                    arr(i) = Mid(arr(i), 8)
                    program = Mid(arr(i), 1, InStr(arr(i), "(") - 1)
                    devices = Mid(arr(i), InStr(arr(i), "(") + 1)
                    devices = IIf(Right(devices, 1) = ")", Mid(devices, 1, Len(devices) - 1), devices)
                Else
                    program = Mid(arr(i), 8)
                    devices = ""
                End If
            Else
                If Trim(m(mns)) <> "" Then
                    m(mns) = "ERRError: Falta ';'"
                End If
            End If
        Else
            'SENTENCIAS CON TERMINADOR
            'Eliminamod el terminador ';'
            arr(i) = Left(arr(i), Len(arr(i)) - 1)
            If Left(LCase(arr(i)), 4) = "cons" Then
                m(mns) = "[CONST     ]"
                'Añadimos en el segmento extra
                ptr = UBound(es)
                ptr = ptr + 1
                ReDim es(1 To ptr + 1)
                es(ptr) = Mid(arr(i), InStr(arr(i), "=") + 1)
                'Agregamos el puntero del ESEGMENT que recoge el valor de la constante
                m(mns) = m(mns) + "ES:" + CStr(ptr)
            ElseIf Left(LCase(arr(i)), 3) = "var" Then
                m(mns) = "[VAR       ]"
                'Añadimos en el segmento extra
                ptr = UBound(ds)
                ptr = ptr + 1
                ReDim ds(1 To ptr + 1)
                ds(ptr) = Mid(arr(i), InStr(arr(i), "=") + 1)
                'Agregamos el puntero del DATASEGEMENT que recoge el valor de la variable
                m(mns) = m(mns) + "DS:" + CStr(ptr)
            Else
                If InStr(arr(i), "=") <> 0 Then
                    m(mns) = "[OPR       ]"
                    'Añadimos en el segmento stack
                    ptr = UBound(ss)
                    ptr = ptr + 1
                    ReDim ds(1 To ptr + 1)
                    ss(ptr) = Mid(arr(i), InStr(arr(i), "=") + 1)
                    'Agregamos el puntero del STACKSEGMENT que recoge la expresión
                    m(mns) = m(mns) + "SS:" + CStr(ptr)
                Else
                    m(mns) = "ERRError: Instrucción de sintáxis"
                End If
            End If
        End If
    Next i
    mnemotecnicos = m()
End Function

Espero que te resulte útil, que comprendas la técnica y desde luego que sepas perdonar los posibles errores de bulto, ya que lo he escrito 'al vuelo'.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #3 (permalink)  
Antiguo 07-11-2006, 08:37:51
Avatar de Alella
Moderador
 
Registrado: mar 2004
Ubicación: BARCELONA - ESPAÑA
Posts: 973
Alella Valoración +2
Predeterminado

Hola, que tal.

Acalanto, yo nunca llevo sombrero, pero me he quedado de piedra y me descubro ante el comentario,,,,,,lo he escrito al VUELO!!!!. Dios, que envidia!!!. Seguro que tienes un cerebro o algo más....electrónico!!!.
__________________
Un saludo.

Alfredo
Barcelona-España
_________________
Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #4 (permalink)  
Antiguo 07-11-2006, 11:01:54
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.197
acalanto ha deshabilitado la reputación
Predeterminado

No Alella, no hay que quitarse el sombrero.

Al decir 'Al Vuelo' me refiero a que no he realizado un estudio previo de necesidades pero he realizado pruebas de 'más o menos' del funcionamiento del parser y el conversor mnemotécnico.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #5 (permalink)  
Antiguo 07-11-2006, 11:09:42
Avatar de Alella
Moderador
 
Registrado: mar 2004
Ubicación: BARCELONA - ESPAÑA
Posts: 973
Alella Valoración +2
Predeterminado

Hola, que tal.

Pues me quitas un peso de encima. En la empresa donde trabajo al 'vuelo' le llamamos de otra manera, lo denominamos desde hace muchos años (el chico que me enseñó cuando entré a trabajar ) 'probar el programa para ver si PETA'. En fin...son formas de hablar.
__________________
Un saludo.

Alfredo
Barcelona-España
_________________
Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #6 (permalink)  
Antiguo 07-11-2006, 12:27:28
Un Nuevo Amigo
 
Registrado: oct 2006
Posts: 5
Silvia_Garcia Valoración +2
Contactar con Silvia_Garcia a través de MSN Contactar con Silvia_Garcia a través de Yahoo
Predeterminado

Hola. Mil gracias por tu respuesta acalanto, la voy a poner en practica al instante.
Gracias por ser tan servicial...
__________________
Sigue siempre hacia adelante...
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


Temas Similares
Tema Autor Foro Respuestas Último Mensaje
Compilador C victor_s C/C++ 1 25-01-2008 23:48:09
Pasar una aplicación de Turbo Pascal 7 a DELPHI7 BEPAI Delphi 0 12-03-2007 11:12:57
como conectarme a pascal armando Visual Basic 6.00 1 26-05-2006 23:33:44
tres dudas.... simba77 Visual Basic 6.00 6 17-09-2004 00:00:00
Compilador externo de VB6 HackLive Visual Basic 6.00 2 18-02-1970 02:37:02


La franja horaria es GMT. Ahora son las 08:45:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
A vBSkinworks Design

Alojado en el servicio Premium de Masquewebs | Diseño mejorado por MasqueWebs

right