Guest User

Untitled

a guest
Aug 19th, 2018
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 27.24 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. @@scopes = Array.new()
  3. @@scopes.push(Hash.new)
  4. @@currentScope = 0
  5. @@output = "Output:\n"
  6. @@evaled = Array.new()
  7. @@statements = Array.new()
  8. @@functions = Hash.new()
  9. @@classes =  Hash.new()
  10. @@lowestScope = 0
  11. @@capState = "public"
  12.  
  13. def makeList(lines)
  14.   list = Array.new()
  15.   if lines.respond_to?('size')
  16.     lines.each {|m|
  17.       if m.respond_to?('size')
  18.         m.each{|b|
  19.           if b.respond_to?('size')
  20.             makeList(b).each{|c|
  21.               list << c
  22.             }
  23.           else
  24.             list << b
  25.           end
  26.         }
  27.       else
  28.         list << m
  29.       end
  30.     }
  31.   else
  32.     list << lines
  33.   end
  34.   return list
  35. end
  36.  
  37. class State
  38.   def initialize(state)
  39.     @state = state
  40.   end
  41.   def eval()
  42.     ## @@capState = @state
  43.   end
  44. end
  45.  
  46. class Variable
  47.   attr_accessor:name, :type, :value, :state
  48.   def initialize(name, type, value)
  49.     @value = value
  50.     @name = name
  51.     @type = type
  52.     @state = @@capState
  53.   end
  54.   def setValue(value)
  55.     if @type == ClassVariable
  56.       @type = @value.class
  57.     end
  58.     if @type == String
  59.       @type = FString
  60.     elsif @type == Fixnum
  61.       @type = Int
  62.     end
  63.     if value.is_a?(@type)
  64.       @value = value
  65.     elsif value.is_a?(ArithmeticStatement) && @type.to_s == "Int"
  66.       while value.respond_to?('eval')
  67.         value = value.eval()
  68.       end
  69.       @value = value
  70.     else
  71.       puts "ERROR: '"+@name[3..@name.size-1].to_s+"' is not a "+@type.to_s
  72.     end
  73.   end
  74.   def eval()
  75.     if @@scopes[@@currentScope][@name] == nil
  76.       @@scopes[@@currentScope][@name] = self
  77.    elsif @@scopes[@@currentScope][@name] != self
  78.       puts "ERROR: variable '"+@name[3..@name.size-1].to_s+"' was already declared in this scope!"
  79.     end
  80.     #@@scopes[@@currentScope][@name] = self
  81.     if !@value.is_a?(DaDaClassObject)
  82.       while @value.respond_to?('eval')
  83.         @value = @value.eval()
  84.       end
  85.     end
  86.     return @value
  87.   end
  88. end
  89.  
  90. class ClassVariable
  91.   attr_accessor:name, :type, :value, :state
  92.   def initialize(name, type, value, state)
  93.     @value = value
  94.     @name = name
  95.     @type = type
  96.     @state = state
  97.   end
  98.   def setValue(value)
  99.     if value.is_a?(@type)
  100.       @value = value
  101.     elsif value.is_a?(ArithmeticStatement) && @type.to_s == "Int"
  102.       while value.respond_to?('eval')
  103.         value = value.eval()
  104.       end
  105.       @value = value
  106.     else
  107.       puts "ERROR: '"+@name[3..@name.size-1].to_s+"' is not a "+@type.to_s
  108.     end
  109.   end
  110.   def eval(parent)
  111.     if parent.scope[@name] != nil && parent.scope[@name] != self
  112.       puts "ERROR: variable '"+@name[3..@name.size-1].to_s+"' was already declared in this scope!"
  113.     else
  114.       if @state == "public"
  115.         list = Array.new()
  116.         list << PrintStatement.new(@value)
  117.         parent.functions[@name] = DaDaClassFunction.new(parent.name, @name, Array.new(), list)
  118.       end
  119.       parent.scope[@name] = self
  120.     end
  121.     while @value.respond_to?('eval')
  122.       @value = @value.eval()
  123.     end
  124.     return @value
  125.   end
  126. end
  127.  
  128. class ReturnStatement
  129.   attr_accessor:value
  130.   def initialize(value)
  131.     @value = value
  132.   end
  133.   def eval()
  134.     if @value.respond_to?('eval')
  135.       @value = @value.eval()
  136.     else
  137.       @value
  138.     end
  139.     if @value.respond_to?('value')
  140.       @value = @value.value
  141.     end
  142.     @value
  143.   end
  144. end
  145.  
  146. class BreakStatement
  147.   #HEJ JAG ÄR TOM
  148. end
  149.  
  150.  
  151. class InputStatement
  152.   def initialize()
  153.   end
  154.   def eval()
  155.     puts gets.chomp
  156.   end
  157. end
  158.  
  159. class FunctionCall
  160.   def initialize(name, args)
  161.     @name = name
  162.     @args = args
  163.   end
  164.   def eval()
  165.     count = 0
  166.     @args.each{|m|
  167.       if m.respond_to?('eval')
  168.         @args[count] = m.eval.value
  169.       end
  170.       if @args[count].is_a?(Fixnum)
  171.         @args[count] = Int.new(@args[count])
  172.       end
  173.       if @args[count].is_a?(String)
  174.         @args[count] = FString.new(@args[count])
  175.       end
  176.       count = count+1
  177.     }
  178.     @@functions[@name].call(@args)
  179.   end
  180. end
  181.  
  182. class ClassFunctionCall
  183.   def initialize(var, function, args)
  184.     @var = var
  185.     @function = function
  186.     @args = args
  187.   end
  188.   def eval()
  189.     if findVar(@var).value.is_a?(FArray) || findVar(@var).value.is_a?(String) || findVar(@var).value.is_a?(FString) || findVar(@var).value.is_a?(Int)
  190.       if @args.size < 1
  191.          findVar(@var).value.send(@function)
  192.       elsif @args.size == 1
  193.         findVar(@var).value.send(@function, @args)
  194.       elsif @args.size == 2
  195.         findVar(@var).value.send(@function,  @args[1], @args[0])
  196.       end
  197.     else
  198.       vars = Hash.new
  199.       func = findVar(@var).value.functions[@function]
  200.       if func.state == "public" || func.state == "publicProtected" || func.state = "publicPrivate"
  201.         funcs = findVar(@var).value.functions
  202.         funcs.each{|m|
  203.           if m[1].state = "private"
  204.             m[1].state = "publicPrivate"
  205.           elsif m[1].state = "protected"
  206.             m[1].state = "publicProtected"
  207.           end
  208.         }
  209.         cObj = findVar(@var).value
  210.         vars = findVar(@var).value.vars
  211.         @@currentScope = @@currentScope+1
  212.         @@lowestScope = @@currentScope
  213.         @@scopes.delete_at(@@currentScope)
  214.         addScope()
  215.         Variable.new("varself", cObj.class, cObj).eval()
  216.         vars.each{|m|
  217.           Variable.new(m[0], m[1].class, m[1].value).eval()
  218.         }
  219.         if vars.has_key?(@function)
  220.           return vars[@function].value
  221.           ## @@output = @@output + vars[@function].value.to_s+"\n"
  222.         else
  223.           ret = func.call(@args)
  224.           @@scopes.delete_at(@@currentScope)
  225.           @@currentScope = @@currentScope-1
  226.           @@lowestScope = 0
  227.           funcs.each{|m|
  228.             if m[1].state == "publicPrivate"
  229.               m[1].state = "private"
  230.             elsif m[1].state == "publicProtected"
  231.               m[1].state = "protected"
  232.           end
  233.           }
  234.           return ret
  235.         end
  236.         @@scopes.delete_at(@@currentScope)
  237.         @@currentScope = @@currentScope-1
  238.         @@lowestScope = 0
  239.         funcs.each{|m|
  240.           if m[1].state == "publicPrivate"
  241.             m[1].state = "private"
  242.           elsif m[1].state == "publicProtected"
  243.             m[1].state = "protected"
  244.           end
  245.         }
  246.       end
  247.     end
  248.   end
  249. end
  250.  
  251. class DaDaFunction
  252.   attr_accessor:name, :state
  253.   def initialize(className, funcName, args, lines)
  254.     if className == "Int"
  255.       className = "Fixnum"
  256.     elsif className == "String"
  257.       className = "FString"
  258.     end
  259.     @className = className
  260.     @name = funcName
  261.     @args = args
  262.     @lines = lines
  263.     @state = @@capState
  264.   end
  265.   def call(args)
  266.     @@currentScope = @@currentScope +1
  267.     addScope()
  268.     if args.size() == @args.size()
  269.       i = 0
  270.       args.reverse.each{|m|
  271.         @args[i].setValue(m)
  272.         i = i +1
  273.       }
  274.     else
  275.       puts "ERROR: "+@name.to_s+"(): wrong amount of arguments!"
  276.     end
  277.     @args.each { |m|
  278.       if m.is_a?(Variable)
  279.         m.eval()
  280.       end
  281.     }
  282.     ret = ""
  283.     @lines.each{|m|
  284.       if m.respond_to?('size')
  285.         m.each{|b|
  286.           if b.is_a?(ReturnStatement)
  287.             if @className == b.eval.class
  288.               @@currentScope = @@currentScope -1
  289.               return b.value
  290.             end
  291.           else
  292.             ret = b.eval()
  293.           end
  294.         }
  295.       elsif m.is_a?(ReturnStatement) || ret.is_a?(ReturnStatement)
  296.         if @className == "Bool" && (m.eval == "false" || m.eval == "true")
  297.           @@currentScope = @@currentScope -1
  298.           return m.value
  299.         elsif @className == "Fixnum" && m.eval.class.to_s == "Int"
  300.           @@currentScope = @@currentScope -1
  301.           return m.value
  302.         elsif @className == m.eval.class.to_s
  303.           @@currentScope = @@currentScope -1
  304.           return m.value
  305.         else
  306.           puts "ERROR: "+m.value.to_s+" is not a "+@className
  307.           return "ERROR: "+m.value.to_s+" is not a "+@className
  308.         end
  309.       else
  310.         ret = m.eval()
  311.       end
  312.       if ret.is_a?(ReturnStatement)
  313.         if @className == ret.eval.class.to_s
  314.           @@currentScope = @@currentScope -1
  315.           return ret.value
  316.         else
  317.           puts "ERROR: "+ret.value.to_s+" is not a "+@className
  318.           return "ERROR: "+ret.value.to_s+" is not a "+@className
  319.         end
  320.       end
  321.     }
  322.     @@currentScope = @@currentScope -1
  323.   end
  324. end
  325.  
  326. class DaDaClassFunction
  327.   attr_accessor:name, :state
  328.   def initialize(className, funcName, args, lines)
  329.     @className = className
  330.     @name = funcName
  331.     @args = args
  332.     @lines = lines
  333.     @state = @@capState
  334.   end
  335.   def call(args)
  336.     @@currentScope = @@currentScope +1
  337.     addScope()
  338.     if args.size() == @args.size()
  339.       i = 0
  340.       args.reverse.each{|m|
  341.         @args[i].setValue(m)
  342.         i = i +1
  343.       }
  344.     else
  345.       puts "ERROR: "+@name.to_s+"(): wrong amount of arguments!"
  346.     end
  347.     @args.each { |m|
  348.       if m.is_a?(Variable)
  349.         m.eval()
  350.       end
  351.     }
  352.     @lines.each{|m|
  353.       if m.respond_to?('size')
  354.         m.each{|b|
  355.           if b.is_a?(ReturnStatement)
  356.             if @className == b.value.class
  357.               @@currentScope = @@currentScope -1
  358.               return b.value
  359.             end
  360.           else
  361.             b.eval()
  362.           end
  363.         }
  364.       elsif m.is_a?(ReturnStatement)
  365.         if @className == m.value.class.to_s
  366.           @@currentScope = @@currentScope -1
  367.           return m.value
  368.         else
  369.           puts "ERROR: "+m.value.to_s+" is not a "+@className
  370.           return "ERROR: "+m.value.to_s+" is not a "+@className
  371.         end
  372.       else
  373.         m.eval()
  374.       end
  375.     }
  376.     @@currentScope = @@currentScope -1
  377.   end
  378. end
  379.  
  380. class DaDaClassObject
  381.   attr_accessor:vars, :functions, :name
  382.   def initialize(className)
  383.     @name = className
  384.     @vars = Hash.new()
  385.     @functions = Hash.new()
  386.   end
  387.   def eval()
  388.     @vars = @@classes[@name].scope
  389.     @functions = @@classes[@name].functions
  390.   end
  391. end
  392.  
  393. class DaDaClass
  394.   attr_accessor:scope, :functions, :name
  395.   def initialize(name, lines)
  396.     @lines = lines
  397.     @name = name
  398.     @scope = Hash.new()
  399.     @functions = Hash.new()
  400.   end
  401.   def eval()
  402.     @lines.each{|m|
  403.       if m.respond_to?('size')
  404.         m.each{|b|
  405.           if b.is_a?(ClassVariable)
  406.             b.eval(self)
  407.           else
  408.             b.eval()
  409.           end
  410.         }
  411.       else
  412.         if m.is_a?(ClassVariable)
  413.           m.eval(self)
  414.         elsif m.is_a?(DaDaFunction)
  415.           @functions[m.name] = m
  416.         else
  417.           m.eval()
  418.         end
  419.       end
  420.     }
  421.   end
  422. end
  423.  
  424. class DaDaSubClass
  425.   attr_accessor:scope, :functions, :name
  426.   def initialize(name, superclass, lines)
  427.     @lines = lines
  428.     @superclass = superclass
  429.     @name = name
  430.     @scope = Hash.new()
  431.     @functions = Hash.new()
  432.   end
  433.   def eval()
  434.     @lines.each{|m|
  435.       if m.respond_to?('size')
  436.         m.each{|b|
  437.           if b.is_a?(ClassVariable)
  438.             b.eval(self)
  439.           else
  440.             b.eval()
  441.           end
  442.         }
  443.       else
  444.         if m.is_a?(ClassVariable)
  445.           m.eval(self)
  446.         elsif m.is_a?(DaDaFunction)
  447.           @functions[m.name] = m
  448.         else
  449.           m.eval()
  450.         end
  451.       end
  452.     }
  453.     @@classes[@superclass].scope.each{|m|
  454.       if !@scope.has_key?(m[0]) && (m[1].state.to_s == "public" || m[1].state.to_s == "protected")
  455.         @scope[m[0]] = m[1]
  456.       end
  457.     }
  458.     @@classes[@superclass].functions.each{|m|
  459.       if !@functions.has_key?(m[0])
  460.         @functions[m[0]] = m[1]
  461.       end
  462.     }
  463.   end
  464. end
  465.  
  466. def getCurrentScope()
  467.   return @currentScope
  468. end
  469.  
  470. class Scope
  471.   attr_accessor:child_scopes, :variables
  472.   @variables = Hash.new();
  473.   def initialize()
  474.     @name = "Global scope"
  475.   end
  476. end
  477.  
  478. class PrintStatement
  479.   attr_accessor:value
  480.   def initialize(val)
  481.     @value = val
  482.   end
  483.   def eval()
  484.     back = @value.clone
  485.     while back.respond_to?('eval')
  486.       back = back.eval()
  487.     end
  488.     while back.respond_to?('call')
  489.       back = back.call()
  490.     end
  491.     if back.is_a?(Hash)
  492.       back.each{|m|
  493.         back = m[1].call(Array.new())
  494.       }
  495.     elsif back.is_a?(Array)
  496.      ## @@output = @@output + back[back.size-1].eval().to_s+"\n"
  497.       puts back[back.size-1].eval().to_s
  498.     elsif back.is_a?(FArray)
  499.       back.value.each{|m|
  500.       ##  @@output = @@output + m.eval().to_s+"\n"
  501.         puts m.eval.to_s
  502.       }
  503.     else
  504.     ##  @@output = @@output.to_s + back.to_s+"\n"
  505.       puts back.to_s
  506.     end
  507.     return back
  508.   end
  509. end
  510.  
  511. class StringArithmetics
  512.   attr_accessor:operator, :left, :right
  513.   def initialize(left, operator, right)
  514.     @operator = operator
  515.     @left = left
  516.     @right = right
  517.   end
  518.   def eval()
  519.     if @left.kind_of?(FString) && @right.kind_of?(ArithmeticStatement)
  520.       return FString.new(instance_eval("@left.eval() #{@operator} @right.eval().eval().to_s"))
  521.     elsif @left.kind_of?(FString) && @right.kind_of?(Int)
  522.       return FString.new(instance_eval("@left.eval() #{@operator} @right.eval().to_s"))
  523.     elsif @left.kind_of?(FString) && @right.kind_of?(FString)
  524.       return FString.new(instance_eval("@left.eval() #{@operator} @right.eval()"))
  525.     end
  526.   end
  527. end
  528.  
  529. class ArithmeticStatement
  530.   attr_accessor:operator, :left, :right
  531.   def initialize(left, operator, right)
  532.     @operator = operator
  533.     @left = left
  534.     @right = right
  535.   end
  536.   def eval()
  537.     if @left.is_a?(VarRep)
  538.       @left = @left.eval()
  539.     end
  540.     if @right.is_a?(VarRep)
  541.       @right = @right.eval()
  542.     end
  543.     if @left.kind_of?(ArithmeticStatement) && @right.kind_of?(ArithmeticStatement)
  544.       return Int.new(instance_eval("#{@left.eval().eval()} #{@operator} #{@right.eval().eval()}"))
  545.     elsif !@left.kind_of?(ArithmeticStatement) && !@right.kind_of?(ArithmeticStatement)
  546.         return Int.new(instance_eval("#{@left.eval()} #{@operator} #{@right.eval()}"))
  547.     elsif !@left.kind_of?(ArithmeticStatement) && @right.kind_of?(ArithmeticStatement)
  548.         return Int.new(instance_eval("#{@left.eval()} #{@operator} #{@right.eval().eval()}"))
  549.     elsif @left.kind_of?(ArithmeticStatement) && !@right.kind_of?(ArithmeticStatement)
  550.       return Int.new(instance_eval("#{@left.eval().eval()} #{@operator} #{@right.eval()}"))
  551.     end
  552.   end
  553. end
  554.  
  555. class Int
  556.   @value = 0
  557.   @error = false
  558.    def initialize(int)
  559.      if int.is_a?(Fixnum)
  560.        @value = int
  561.      elsif int.is_a?(Int)
  562.        @value = int.value
  563.      else
  564.        @error = true
  565.        puts "ERROR: "+int.to_s+" is not an Int!"
  566.      end
  567.    end
  568.    def setValue(newValue)
  569.      if newValue.is_a?(Fixnum)
  570.        @value = newValue
  571.        return self
  572.      elsif newValue.is_a?(Int)
  573.        @value = newValue.value
  574.        return self
  575.      else
  576.        @error = true
  577.        puts "ERROR: "+newValue.to_s+" is not an Int!"
  578.      end
  579.    end
  580.    def eval()
  581.      @value
  582.    end
  583.  
  584.    def sort(array)
  585.      temp = Array.new()
  586.      array.each{|m|
  587.        temp << m.value
  588.      }
  589.      temp.sort!
  590.      retArray = Array.new()
  591.      temp.each{|b|
  592.        retArray << Int.new(b)
  593.      }
  594.      retArray
  595.    end
  596.  
  597.    def rsort(array)
  598.      temp = Array.new()
  599.      array.each{|m|
  600.        temp << m.value
  601.      }
  602.      temp.sort!
  603.      retArray = Array.new()
  604.      temp.reverse.each{|b|
  605.        retArray << Int.new(b)
  606.      }
  607.      retArray
  608.    end
  609.    attr_accessor:value, :error
  610. end
  611.  
  612. def checkScope(scope, var)
  613.  
  614. end
  615.  
  616. def printScopes()
  617.   @@currentScope.downto(0).each{|m|
  618.     print "Scope "+m.to_s+": "
  619.     puts @@scopes[m].to_s
  620.   }
  621. end
  622.  
  623. def findVar(var)
  624.   scope = @@currentScope
  625.   @@currentScope.downto(@@lowestScope).each{|m|
  626.     if @@scopes[m] != nil
  627.       if @@scopes[m][var] != nil
  628.         return @@scopes[m][var]
  629.       end
  630.     end
  631.   }
  632.   return "Error: Variable '"+var[3..var.size-1].to_s+"' was not declared!"
  633. end
  634.  
  635. def setVar(var, newVal)
  636.   scope = @@currentScope
  637.   @@currentScope.downto(0).each{|m|
  638.     if @@scopes[m] != nil
  639.       if @@scopes[m][var] != nil
  640.         return @@scopes[m][var].setValue(newVal)
  641.       end
  642.     end
  643.   }
  644.   puts "Error: Variable '"+var[3..var.size-1].to_s+"' was not declared!"
  645. end
  646.  
  647. def setClassVar(var, newVal)
  648.   scope = @@currentScope
  649.   @@currentScope.downto(0).each{|m|
  650.     if @@scopes[m] != nil
  651.       if @@scopes[m][var] != nil
  652.         return @@scopes[m][var].setValue(newVal)
  653.       end
  654.     end
  655.   }
  656.   puts "Error: Variable '"+var[3..var.size-1].to_s+"' was not declared!"
  657. end
  658.  
  659. class VarRep
  660.   attr_accessor:name, :scope
  661.   def initialize(var)
  662.     @scope = @@currentScope
  663.     @name = var
  664.   end
  665.   def eval()
  666.     findVar(@name)
  667.   end
  668. end
  669.  
  670. class VarChanger
  671.   def initialize(var, newVal)
  672.     @name = var
  673.     @newVal = newVal
  674.   end
  675.   def eval()
  676.     setClassVar(@name, @newVal)
  677.   end
  678. end
  679.  
  680. class ClassVarChanger
  681.   def initialize(classVar, var, newVal)
  682.     @classVar = classVar
  683.     @name = var
  684.     @newVal = newVal
  685.   end
  686.   def eval()
  687.     findVar(@classVar).value.vars[@name].setValue(@newVal)
  688.     if findVar(@classVar).value.functions[@name] != nil
  689.       list = Array.new()
  690.       list << PrintStatement.new(findVar(@classVar).value.vars[@name].value) # FIXA(ändra till return)
  691.       findVar(@classVar).value.functions[@name] = DaDaClassFunction.new(@classVar, @name, Array.new(), list)
  692.     end
  693.   end
  694. end
  695.  
  696. class ForeachStatement
  697.   def initialize(array, variable, lines)
  698.     @array = array
  699.     @variable = variable
  700.     @lines = lines
  701.   end
  702.   def eval()
  703.     stop = false
  704.     @array = @array.eval().value.value
  705.     @@currentScope = @@currentScope +1
  706.     addScope()
  707.     @array.each{|m|
  708.       @@scopes[@@currentScope][@variable] = m
  709.       #puts     @@scopes[@@currentScope][@variable]
  710.       @lines.each{|b|
  711.         if b.respond_to?('size')
  712.           b.each{|c|
  713.             if c.is_a?(BreakStatement)
  714.               @@scopes.delete_at(@@currentScope)
  715.               @@currentScope = @@currentScope -1
  716.               return BreakStatement
  717.             else
  718.               ret = c.eval()
  719.             end
  720.           }
  721.         elsif b.is_a?(BreakStatement)
  722.           @@scopes.delete_at(@@currentScope)
  723.           @@currentScope = @@currentScope -1
  724.           return BreakStatement
  725.         else
  726.           ret = b.eval()
  727.         end
  728.         if ret == BreakStatement
  729.           stop = true
  730.           break
  731.         end
  732.       }
  733.       if stop
  734.         break
  735.       end
  736.     }
  737.     @@scopes.delete_at(@@currentScope)
  738.     @@currentScope = @@currentScope -1
  739.   end
  740. end
  741.  
  742.  
  743. class WhileStatement
  744.   def initialize(a, operator, b, lines)
  745.     @a = a
  746.     @operator = operator
  747.     @b = b
  748.     @lines = lines
  749.   end
  750.   def eval()
  751.     ret = ""
  752.     @@currentScope = @@currentScope +1
  753.     addScope()
  754.     while compare(@a, @operator, @b) == true
  755.       @lines.each{|m|
  756.         if m.respond_to?('size')
  757.           m.each{|b|
  758.             if b.is_a?(BreakStatement)
  759.               @@scopes.delete_at(@@currentScope)
  760.               @@currentScope = @@currentScope -1
  761.               return BreakStatement
  762.             else
  763.               ret = b.eval()
  764.             end
  765.           }
  766.         elsif m.is_a?(BreakStatement)
  767.           @@scopes.delete_at(@@currentScope)
  768.           @@currentScope = @@currentScope -1
  769.           return BreakStatement
  770.         else
  771.           ret = m.eval()
  772.         end
  773.         if ret == BreakStatement
  774.           @@scopes.delete_at(@@currentScope)
  775.           @@currentScope = @@currentScope -1
  776.           return BreakStatement
  777.         end
  778.       }
  779.     end
  780.     @@scopes.delete_at(@@currentScope)
  781.     @@currentScope = @@currentScope -1
  782.   end
  783. end
  784.  
  785. def addScope()
  786.   if @@scopes[@@currentScope] == nil
  787.     @@scopes << Hash.new()
  788.   end
  789. end
  790.  
  791. class IfStatement
  792.   def initialize(a, operator, b, lines)
  793.     @a = a
  794.     @operator = operator
  795.     @b = b
  796.     @lines = lines
  797.   end
  798.   def addelseifs(elseif)
  799.     @stmts = Array.new()
  800.     elseif.reverse.each{|m|
  801.       @stmts << m
  802.     }
  803.   end
  804.   def eval()
  805.     ret = ""
  806.     @@currentScope = @@currentScope +1
  807.     addScope()
  808.     if compare(@a, @operator, @b) == true
  809.       @lines.each{|m|
  810.         if m.respond_to?('size')
  811.           m.each{|b|
  812.             if b.is_a?(BreakStatement)
  813.               @@scopes.delete_at(@@currentScope)
  814.               @@currentScope = @@currentScope -1
  815.               return BreakStatement
  816.             elsif b.is_a?(ReturnStatement)
  817.               @@scopes.delete_at(@@currentScope)
  818.               @@currentScope = @@currentScope -1
  819.               return b
  820.             else
  821.               ret = b.eval()
  822.             end
  823.           }
  824.         elsif m.is_a?(BreakStatement)
  825.           @@scopes.delete_at(@@currentScope)
  826.           @@currentScope = @@currentScope -1
  827.           return BreakStatement
  828.         elsif m.is_a?(ReturnStatement)
  829.           @@scopes.delete_at(@@currentScope)
  830.           @@currentScope = @@currentScope -1
  831.           return m
  832.         else
  833.           ret = m.eval()
  834.         end
  835.         if ret == BreakStatement
  836.           @@scopes.delete_at(@@currentScope)
  837.           @@currentScope = @@currentScope -1
  838.           return BreakStatement
  839.         elsif ret.is_a?(ReturnStatement)
  840.           @@scopes.delete_at(@@currentScope)
  841.           @@currentScope = @@currentScope -1
  842.           return ret
  843.         end
  844.       }
  845.     elsif @stmts != nil
  846.       @stmts.each{|m|
  847.         if m.respond_to?('eval')
  848.           ret = m.eval()
  849.         end
  850.         if ret == BreakStatement
  851.           @@scopes.delete_at(@@currentScope)
  852.           @@currentScope = @@currentScope -1
  853.           return BreakStatement
  854.         end
  855.         if ret.is_a?(ReturnStatement)
  856.           @@scopes.delete_at(@@currentScope)
  857.           @@currentScope = @@currentScope -1
  858.           return ret
  859.         end
  860.       }
  861.     end
  862.     @@scopes.delete_at(@@currentScope)
  863.     @@currentScope = @@currentScope -1
  864.   end
  865. end
  866.  
  867. class ElseIfStatement
  868.   attr_accessor:evaled
  869.   def initialize(a, operator, b, lines)
  870.     @a = a
  871.     @operator = operator
  872.     @b = b
  873.     @lines = lines
  874.   end
  875.   def eval()
  876.     ret = ""
  877.     if compare(@a, @operator, @b) == true
  878.       @lines.each{|m|
  879.         if m.respond_to?('size')
  880.           m.each{|b|
  881.             if b.is_a?(BreakStatement)
  882.               return BreakStatement
  883.             elsif b.is_a?(ReturnStatement)
  884.               return b
  885.             else
  886.               ret = b.eval()
  887.             end
  888.           }
  889.         elsif m.is_a?(BreakStatement)
  890.           return BreakStatement
  891.         elsif m.is_a?(ReturnStatement)
  892.           return m
  893.         else
  894.           ret = m.eval()
  895.         end
  896.         if ret == BreakStatement
  897.           return BreakStatement
  898.         elsif ret.is_a?(ReturnStatement)
  899.           return ret
  900.         end
  901.       }
  902.       return true
  903.     end
  904.     return false
  905.   end
  906. end
  907.  
  908. class ElseStatement
  909.   def initialize(lines)
  910.     @lines = lines
  911.   end
  912.   def eval()
  913.     @lines.each{|m|
  914.       if m.respond_to?('size')
  915.         m.each{|b|
  916.           if b.is_a?(BreakStatement)
  917.             return BreakStatement
  918.           elsif b.is_a?(ReturnStatement)
  919.             return b
  920.           else
  921.            ret = b.eval()
  922.           end
  923.           }
  924.       elsif m.is_a?(BreakStatement)
  925.         return BreakStatement
  926.       elsif m.is_a?(ReturnStatement)
  927.         return m
  928.       else
  929.        ret = m.eval()
  930.       end
  931.       if ret == BreakStatement
  932.         return BreakStatement
  933.       elsif ret.is_a?(ReturnStatement)
  934.         return ret
  935.       end
  936.     }
  937.   end
  938. end
  939.  
  940. class FString
  941.   @value = ""
  942.   @error = false
  943.    def initialize(string)
  944.      if string.is_a?(String)
  945.        @value = string
  946.      elsif string.is_a?(FString)
  947.        @value = string.value
  948.      elsif string.is_a?(StringArithmetics)
  949.        @value = string.eval()
  950.      else
  951.        @error = true
  952.        puts "ERROR: "+string.to_s+" is not a String!"
  953.      end
  954.    end
  955.    def setValue(newValue)
  956.      if newValue.is_a?(String)
  957.        @value = newValue
  958.        return @value
  959.      elsif newValue.is_a?(FString)
  960.        @value = newValue.value
  961.        return @value
  962.      else
  963.        @error = true
  964.        puts "ERROR: "+newValue.to_s+" is not a String!"
  965.      end
  966.    end
  967.    def eval()
  968.      @value
  969.    end
  970.  
  971.    def sort(array)
  972.      temp = Array.new()
  973.      array.each{|m|
  974.        temp << m.value
  975.      }
  976.      temp.sort!
  977.      retArray = Array.new()
  978.      temp.each{|b|
  979.        retArray << FString.new(b)
  980.      }
  981.      retArray
  982.    end
  983.  
  984.    def rsort(array)
  985.      temp = Array.new()
  986.      array.each{|m|
  987.        temp << m.value
  988.      }
  989.      temp.sort!
  990.      retArray = Array.new()
  991.      temp.reverse.each{|b|
  992.        retArray << FString.new(b)
  993.      }
  994.      retArray
  995.    end
  996.  
  997.    attr_accessor:value, :error
  998. end
  999.  
  1000. class Bool
  1001.   @value = "false"
  1002.   @error = false
  1003.    def initialize(bool)
  1004.      if bool == "true" || bool == "false"
  1005.        @value = bool
  1006.      elsif bool.is_a?(Bool)
  1007.        @value = bool.value
  1008.      else
  1009.        @error = true
  1010.        puts "ERROR: "+bool.to_s+" is not a Bool!"
  1011.      end
  1012.    end
  1013.    def setValue(newValue)
  1014.      if newValue == "true"
  1015.        @value = newValue
  1016.        return @value
  1017.      elsif newValue == "false"
  1018.        @value = newValue
  1019.        return @value
  1020.      elsif newValue.is_a?(Bool)
  1021.        @value = newValue.value
  1022.        return @value
  1023.      else
  1024.        @error = true
  1025.        puts "ERROR: "+newValue.to_s+" is not a Bool!"
  1026.      end
  1027.    end
  1028.    def eval()
  1029.      @value
  1030.    end
  1031.  
  1032.    attr_accessor:value, :error
  1033. end
  1034.  
  1035. class FArray
  1036.   attr_accessor:error
  1037.   @error = false
  1038.   def initialize(string)
  1039.     @type  = string
  1040.     @type = instance_eval("@type")
  1041.     @value = Array.new()
  1042.   end
  1043.   def setValue(newValue)
  1044.     if newValue.is_a?(String)
  1045.       @value = newValue
  1046.       return @value
  1047.     elsif newValue.is_a?(FString)
  1048.       @value = newValue.value
  1049.       return @value
  1050.     else
  1051.       return newValue.to_s+" is not a String!"
  1052.     end
  1053.   end
  1054.   def append(val)
  1055.     if @type == val[0].class
  1056.       @value.push(val[0])
  1057.     else
  1058.       puts "ERROR: "+val[0].to_s+" is not a "+@type.to_s
  1059.     end
  1060.   end
  1061.  
  1062.   def delete(index)
  1063.     @value.delete_at(index[0].value)
  1064.   end
  1065.  
  1066.   def pop()
  1067.     @value.pop()
  1068.   end
  1069.  
  1070.   def insert(index, value)
  1071.     @value.insert(index.value, value)
  1072.   end
  1073.  
  1074.   def find(val)
  1075.     index = 0
  1076.     @value.each{|m|
  1077.       if m.value == val[0].value
  1078.         return index
  1079.       end
  1080.       index = index+1
  1081.     }
  1082.     return "ERROR: array does not contain "+val[0].value.to_s
  1083.   end
  1084.  
  1085.   def getIndex(index)
  1086.     if @value[index[0].value] != nil
  1087.       return @value[index[0].value]
  1088.     else
  1089.       return "ERROR: index "+index[0].value.to_s+" does not exist!"
  1090.     end
  1091.   end
  1092.  
  1093.   def sort()
  1094.     if @value.size > 0 && @value[0].respond_to?('sort')
  1095.       @value = @value[0].sort(@value)
  1096.     end
  1097.   end
  1098.  
  1099.   def rsort()
  1100.     if @value.size > 0 && @value[0].respond_to?('rsort')
  1101.       @value = @value[0].rsort(@value)
  1102.     end
  1103.   end
  1104.  
  1105.    attr_accessor:value
  1106. end
  1107.  
  1108. def compare(a, comp, b)
  1109.   if a.is_a?(VarRep) || b.is_a?(VarRep)
  1110.     a = a.eval()
  1111.     b = b.eval()
  1112.     if a.respond_to?('eval')
  1113.       a = a.eval()
  1114.     end
  1115.     if b.respond_to?('eval')
  1116.       b = b.eval()
  1117.     end
  1118.   else
  1119.     a = a.value()
  1120.     b = b.value()
  1121.   end
  1122.   if comp == "<="
  1123.     if a <= b
  1124.       return true
  1125.     end
  1126.   elsif comp == "<"
  1127.     if a < b
  1128.       return true
  1129.     end
  1130.   elsif comp == ">"
  1131.     if a > b
  1132.       return true
  1133.     end
  1134.   elsif comp == "=="
  1135.     if a == b
  1136.       return true
  1137.     end
  1138.   elsif comp == ">="
  1139.     if a >= b
  1140.       return true
  1141.     end
  1142.   elsif comp == "!="
  1143.     if a != b
  1144.       return true
  1145.     end
  1146.   elsif comp == "in"
  1147.     #gör nÃ¥got
  1148.   elsif comp == "!in"
  1149.     #nÃ¥got
  1150.   end
  1151.   return false
  1152. end
Add Comment
Please, Sign In to add comment