document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. \' Gambas class file
  2.  
  3. Private parseTree As New Expresion[]
  4.  
  5. Private errores As String = ""
  6.  
  7. Public Sub _new(s As String)
  8.  
  9.   Dim a As Integer
  10.   Dim ope As Boolean
  11.   Dim token As String[]
  12.   Dim valor As Float
  13.  
  14.   Dim ExpresionMenos As TerminalExpresion_Minus
  15.   Dim ExpresionMas As TerminalExpresion_Plus
  16.   Dim ExpresionNumero As TerminalExpresion_Number
  17.   Dim ExpresionDivide As TerminalExpresion_Div
  18.   Dim ExpresionMulti As TerminalExpresion_Multi
  19.  
  20.   \'elimino espacios iniciales y finales
  21.   s = RTrim$(s)
  22.   s = LTrim$(s)
  23.  
  24.   token = Split(s, " ")
  25.  
  26.   For a = 0 To token.count - 1
  27.     \'detectar operadores
  28.     ope = False
  29.     Select Case token[a]
  30.       Case "+"
  31.         ExpresionMas = New TerminalExpresion_Plus
  32.         parseTree.Add(ExpresionMas)
  33.         ope = True
  34.       Case "-"
  35.         ExpresionMenos = New TerminalExpresion_Minus
  36.         parseTree.Add(ExpresionMenos)
  37.         ope = True
  38.       Case "*"
  39.         ExpresionMulti = New TerminalExpresion_Multi
  40.         parseTree.Add(ExpresionMulti)
  41.         ope = True
  42.       Case "/"
  43.         ExpresionDivide = New TerminalExpresion_Div
  44.         parseTree.Add(ExpresionDivide)
  45.         ope = True
  46.     End Select
  47.     \'detectar nuemros
  48.     If ope = False Then
  49.       \'puede que sea un numero
  50.       Try valor = Val(Replace$((token[a]), ".", ","))
  51.       If Error Then
  52.         If token[a] = " " Then
  53.           \'espacio en blanco en la expresion
  54.           Continue
  55.         Else
  56.          
  57.           errores = "Error al intentar traducir la expresion (" & s & "), fallo en: [" & token[a] & "]"
  58.           Return
  59.         Endif
  60.        
  61.       Else
  62.         \'no ha habido errores...
  63.         ExpresionNumero = New TerminalExpresion_Number(valor)
  64.         parseTree.Add(ExpresionNumero)
  65.       Endif
  66.      
  67.     Endif
  68.    
  69.   Next
  70.  
  71. End
  72.  
  73. Public Function evaluate() As Variant[]
  74.  
  75.   Dim contexto As New Float[]
  76.   Dim e As Expresion
  77.   Dim estado As Variant[]
  78.  
  79.   If errores <> "" Then
  80.     \'al parsear la expresion no se ha detectado un error.
  81.     Return [False, 0, errores]
  82.   Endif
  83.  
  84.   For Each e In parseTree
  85.     estado = e.interpreter(contexto)
  86.     If estado[0] = False Then
  87.       Return [False, 0, "Error: " & estado[1]]
  88.     Endif
  89.   Next
  90.  
  91.   Return [True, contexto.Pop(), ""]
  92.  
  93. End
');