• Sábado 4 de Mayo de 2024, 19:39

Autor Tema:  compilador de expresion posfija  (Leído 2300 veces)

yuriev

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
compilador de expresion posfija
« en: Sábado 11 de Abril de 2009, 02:31 »
0
hola soy nuevo en el foro, y me gustria saber si alguien me puede ayudar con un programa que al darle una expresion posfija, genere el codigo intermedio y asigne espacios de memoria, me ure la primera parte, he estado tratando de hacerlo en visual basic, pero no puedo havanzar, solo logro meter la expresion en la pila, pero no logro sacarla de manera adecuada, de antemano gracias, q tengan un lindo dia

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: compilador de expresion posfija
« Respuesta #1 en: Domingo 12 de Abril de 2009, 14:27 »
0
No das detalles de lo que llevas avanzado, pero bueno... supondremos entonces que estás al principio, es decir sabes lo que quieres hacer(o casi) pero no como lograrlo...

Como debes saber la notación postfija no precisa parçéntesis. Bien partiendo de aquí es necesario que sepas y establezcas una tabla de prioridades aplicada a los operadores...

Para no hacerlo más complejo de lo necesario supondremos que tus operadores son operadores aritméticos, es decir  +, - *, / (las 4 operaciones básicas).
Como sabrás el orden de prioridad de los operadores aritméticos es 1º: multiplicación, 2º: división, 3º: suma, 4º: resta. Por tanto una expresión como: 5*2 + 3 / 3 - 6 * 2 puede de entrada ser distinto de : (5*2) + (3/3) - (6*2) y  ser distinto de: (5 * 2 + 3) / (3 - (6 * 2)) , etc... por tanto  a dichos operadores hay que añadir los operadores: 0º: ( , y el -1º: )

Dicho de otro modo, la tabla de prioridades es una definición de las 'normas'  cuyo criterio ha de cumplir tu programa según lo esperado. Debes saber que lo que está entre paréntesis se ejecuta antes que el resto, por ello los símbolos de paréntesis deben definirse también como operadores, en este caso sólo operan prioridad, lo que implica un orden, por tanto si los defines como operadores de orden, nadie podrá decirte que no. Entendiendo correctamente estos antecedentes, ya podemos empezar a formular nuestro analizador...

..digamos que nuestro compilador tendrá al menos 2 fases claras, una que analiza las expresiones entradas y otra que después evalúa (opera con) el resultado.
Ciertamente para ello necesitamos una pila y lo mejor para todo ello es trabajar con clases, para trabajar más cómodamente cada apartado. Visual Basic no tiene una pila como objeto de programación, por tanto lo 1º será recrear una sencilla pila.

Te pongo un un ejemplo, que podrás modificar a tu gusto. nota especialmente que a esta pila le hemos dado una propiedad 'especial', al permitir que actúe como fifo, filo incluso como ambas a la vez...
Nota que el VB 6.0 lo mejor para implementar una pila es una colección. y nota también que nuestra pila es una pila genérica, por eso utilizamos elementos de tipo variant.
Si  a la hora de utilizarlo tienes claro que sólo usarás un tipo de elemento, por ejemplo string, sería conveniente cambiar los prototipos a string en vez de a variant, sin embargo fíjate que es probable que necesites usar más de una pila en tu proyecto por lo que podrías necesitar realmente tener un tipo variant,... qué tal si la pila de tu proyecto usara como elementos precisamente elementos de tipo pila ???. Tendrías muchas posibilidades de un gran trabajo adelantado por una enorme sencilez antes esta posibilidad... piensa en ello detenidamente...
Código: Visual Basic
  1.  
  2.  
  3. Public Enum enTipoPila
  4.     PILATIPO_FILO = 1            ' primero en entrar último en salir
  5.     PILATIPO_FIFO = 2            ' primero en entrar primero en salir.
  6.     PILATIPO_AMBOS = 3           ' se decide de qué extremo queremos sacar indistintamente
  7. End Enum
  8.  
  9. Public Enum enExtremo
  10.     EXTREMO_INICIAL = 0
  11.     EXTREMO_FINAL = 1
  12. End Enum
  13.  
  14.  
  15. ' =========== CAMPOS DE LAS PROPIEDADES ================
  16.  
  17. Private p_Pila As New Collection
  18. Private p_TipoPila As enTipoPila
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26. ' =========== PROPIEDADES DE LA CLASE ==================
  27.  
  28. Public Property Get TipoPila() As enTipoPila
  29.     TipoPila = p_TipoPila
  30. End Property
  31.     Public Property Let TipoPila(ByVal tp As enTipoPila)
  32.         p_TipoPila = tp
  33.     End Property
  34.  
  35. Public Property Get Count() As Long
  36.     Count = p_Pila.Count
  37. End Property
  38.  
  39.  
  40.  
  41.  
  42.  
  43. '============= MÉTODOS públicos DE LA PILA =============
  44.  
  45. ' la pila siempre añade al final
  46. Public Sub Push(ByRef Elemento As Variant)
  47.     p_Pila.Add (Elemento)
  48. End Sub
  49.  
  50. ' en 'nuestra' pila podremos quitar del inio, del final o de ambos...
  51. '  es una pila 'especial'...
  52.  
  53. ' extremos sólo es necesario para el caso de la pila de extraer de 'ambas partes indistintamente
  54. Public Function Pop(Optional Extremo As enExtremo = EXTREMO_INICIAL) As Variant
  55.     If p_Pila.Count > 0 Then  ' sólo si la pila tiene elementos devolvemos...
  56.         Select Case p_TipoPila
  57.             Case enTipoPila.PILATIPO_FILO
  58.                 Pop = PopFilo
  59.             Case enTipoPila.PILATIPO_FIFO
  60.                 Pop = PopFifo
  61.             Case enTipoPila.PILATIPO_AMBOS
  62.                 'If IsMissing(Extremo) Then Extremo = EXTREMO_INICIAL '
  63.                 If Extremo = EXTREMO_FINAL Then
  64.                     Pop = PopFilo
  65.                 Else  ' toma del principio.
  66.                     Pop = PopFifo
  67.                 End If
  68.         End Select
  69.     Else   ' quitar elementos de una colección vacía origina un error,ocasionalmente podría sustituirse por on local error resume next..
  70.         ' no devuelve elementos
  71.         Pop = "No elementos"
  72.     End If
  73. End Function
  74.  
  75.  
  76.  
  77.  
  78.  
  79. '============= MÉTODOS privados DE LA PILA =============
  80.  
  81. ' pop siempre devuelve un elemento y luego lo elimina, en este caso del final
  82. Private Function PopFilo() As Variant
  83.     PopFilo = p_Pila.Item(p_Pila.Count)
  84.         p_Pila.Remove (p_Pila.Count)
  85. End Function
  86.  
  87. ' pop siempre devuelve un elemento y luego lo elimina, en este caso del inicio.
  88. Private Function PopFifo() As Variant
  89.     PopFifo = p_Pila.Item(1)  ' las colecciones se basan en índice 1
  90.         p_Pila.Remove (1)
  91. End Function
  92.  
  93.  
  94.  
  95.  
  96.  
  97. '============== MÉTODOS DE LA CLASE ==================
  98.  
  99. Private Sub Class_Initialize()
  100.     p_TipoPila = PILATIPO_FILO ' puesto que los valores van del 1 al 3, 0 no se admite.
  101. End Sub
  102.  
  103. Private Sub Class_Terminate()
  104.     Set p_Pila = Nothing
  105. End Sub
  106.  
  107.  

... a la tarde continúo en otro mensaje, el post será un poquito extenso... pero de momento puedes probar a mmanejar la pila
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
«Ma non troppo»
----> ModoVacaciones = False<----

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: compilador de expresion posfija
« Respuesta #2 en: Miércoles 29 de Abril de 2009, 21:24 »
0
... de nada..

Creo que hice bien, en dividir el asunto y parar, hasta esperar respuesta, hubiera perdido el tiempo para nada...

Es habitual que alguien postee un mensaje y jamás vuelva siquiera a ver la respuesta...
«Ma non troppo»
----> ModoVacaciones = False<----

yuriev

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: compilador de expresion posfija
« Respuesta #3 en: Jueves 30 de Abril de 2009, 06:42 »
0
Sorry, lo que pasa es que andaba checando lo del codigo y afinando los detalles de lo que hay que hacer, mira lo de la expresion posfija, si se lo que es, de hecho ya tengo bien el tema definidino. Se supone que llevará entre 6 y 8 text box, en las cuales se escribirá la expresion posfija, pero sin tomar en cuenta los parentesis, bueno no lo tengo contemplado para no crear mas problemas. como bien lo mencionas la expresion se guardará en una pila, aunq no se trabajar bien con clases. Para esto debe aver dos funciones, una Pop y otra Push, para meter los elemetos dentro de la pila, eso es solo como para verificar q si lo hace o algo asi, aun no es indispensable, de ahi debe reconocer si es operador para que saque los elementos y haga la operacion correspondiente para realizar el codigo intermedio (esta parte ya casi lo tengo, o eso creo, jeje, pasado mañana subo el codigo xq no lo tengo en esta compu), esto se debe de guardar en otro arreglo para despues asignarles las localidades de memoria a partir del 200.

Y andaba investigandole eso de las colecciones, xq eso si no entiendo bien como funciona. Espero no te haya desanimado y me sigas ayudando, se que eres muy bueno para esto del VB por otros comentarios del foro, y gracias de antemano.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: compilador de expresion posfija
« Respuesta #4 en: Jueves 30 de Abril de 2009, 10:12 »
0
Sólo un pequeño comentario, sin entrometerme demasiado: VB6 no es orientado a objetos, y por tanto no tiene clases.