Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
mdt.rb - mdt.rb

mdt.rb

Caricato da:
Scarica il programma completo

  1. #!/usr/bin/env ruby
  2. #####################################################################
  3. #
  4. # mdt.rb (Implementazione della Macchina di Turing)
  5. #
  6. #
  7. # 06/12/2007 - edited by Invisigoth <njprincess_autobot@yahoo.it>"
  8. #
  9. # mdt.rb is distributed under the terms of the GNU General Public
  10. # License.  See the file COPYING for details.
  11. #
  12. ######################################################################
  13.  
  14. $prog = "mdt.rb - ver 1.0 (distributed under the terms of the GNU General Public License)"
  15. $author = "edited by Invisigoth <njprincess_autobot@yahoo.it>"
  16. $hstr = "\n*** #{$prog}\n*** #{$author}"
  17.  
  18. $CLEAR_STR = "\e[H\e[2J"
  19.  
  20. require 'command'
  21.  
  22. def globalM_Authors
  23.         puts $hstr
  24. end
  25.  
  26. class RegolaNonTrovataError < StandardError
  27. end
  28.  
  29. class FormatError < StandardError
  30. end
  31.  
  32. class Direzione
  33.         SINISTRA = -1
  34.         DESTRA = +1
  35.         NULLA = 0
  36.         def Direzione.to_s(str)
  37.                 if str.to_i <= Direzione.SINISTRA then
  38.                         return "Sinistra"
  39.                 elsif str.to_i >= Direzione.DESTRA then
  40.                         return "Destra"
  41.                 else
  42.                 #if str.to_i == Direzione.NULLA then
  43.                         return "Nulla"
  44.                 end
  45.         end
  46.         def Direzione.equal?(dir1, dir2)
  47.                 if( ((dir1.to_i * dir2.to_i) == 0) || ((dir1.to_i * dir2.to_i) > 0) )then
  48.                         return true
  49.                 elsif( (dir1.to_i * dir2.to_i) < 0) then
  50.                         return false
  51.                 end
  52.         end
  53.         def Direzione.SINISTRA
  54.                 return SINISTRA
  55.         end
  56.         def Direzione.DESTRA
  57.                 return DESTRA
  58.         end
  59.         def Direzione.NULLA
  60.                 return NULLA
  61.         end
  62. end
  63.  
  64. class Nastro
  65.         attr_accessor   :nastro_win
  66.         attr_accessor   :blank
  67.  
  68.         def initialize(str = "", pos = 0)
  69.                 @hashTape = {}
  70.                 @blank = "b"
  71.                 @nastro_win = 5
  72.                 @max = 0
  73.                 @min = 0
  74.  
  75.                 @pos = 0
  76.                 self.pos = pos
  77.                 upgradeMinMax
  78.         end
  79.         def read
  80.                 return getCell(@pos)
  81.         end
  82.         def write(sim)
  83.                 setCell(@pos, sim)
  84.         end
  85.         def muovi(dir)
  86.                 if Direzione.equal?(dir.to_i, Direzione.DESTRA) then
  87.                         shiftDestra
  88.                 elsif Direzione.equal?(dir.to_i, Direzione.SINISTRA) then
  89.                         shiftSinistra
  90.                 end
  91.         end
  92.         def blank=(sim)
  93.                 @blank = sim.split("")[0] if !sim.nil?
  94.         end
  95.         def nastro_win=(win)
  96.                 @nastro_win = win.to_i
  97.         end
  98.         def pos
  99.                 @pos
  100.         end
  101.         def mov
  102.         end
  103.         def shiftDestra
  104.                 self.pos = (@pos + Direzione.DESTRA)
  105.                
  106.         end
  107.         def shiftSinistra
  108.                 self.pos = (@pos + Direzione.SINISTRA)
  109.         end
  110.         def clear
  111.                 @hashTape = {}
  112.                 @pos = 0
  113.         end
  114.         def from_s(str, pos = 0)
  115.                 i = pos.to_i
  116.                 str.to_s.split("").each {|c| setCell(i, c); i +=1}
  117.         end
  118.         def to_s
  119.                 str = ""
  120.                 (@min..@max).each do |i|
  121.                         retCell = getCell(i)
  122.                         if i != @pos
  123.                                 str += retCell
  124.                         else
  125.                                 str += "[" + retCell +"]"
  126.                         end
  127.                 end
  128.                 return str
  129.         end
  130.         def inspect
  131.                 str = ""
  132.                 (@min..@max).each do |i|
  133.                         retCell = getCell(i)
  134.                         if i != @pos
  135.                                 str += "#{retCell.to_s}"
  136.                         else
  137.                                 str += "[#{retCell.to_s}]"
  138.                         end
  139.                 end
  140.                 return "#{self.class} |#{str}|"
  141.         end
  142.  
  143.         private
  144.         def getCell(pos)
  145.                 retVal = @hashTape[pos.to_i]
  146.                 if retVal.nil? then
  147.                         return @blank
  148.                 else
  149.                         return retVal #.to_s[0] <--- è gia garantito nel Nastro.setCell(pos, sim)
  150.                 end
  151.         end
  152.         def setCell(pos, sim)
  153.                 @hashTape[pos.to_i] = sim.to_s
  154.         end
  155.         def pos=(pos)
  156.                 @pos = pos.to_i if !pos.nil?
  157.                 upgradeMinMax
  158.         end
  159.         protected
  160.         def upgradeMinMax
  161.                 upgradeMinMax_slide
  162.         end
  163.         def upgradeMinMax_center
  164.                 @max = @pos + @nastro_win
  165.                 @min = @pos - @nastro_win
  166.         end
  167.         def upgradeMinMax_slide
  168.                 if @pos > (@max - @nastro_win) then
  169.                         @max = @pos + @nastro_win
  170.                 end
  171.                 if @pos < (@min + @nastro_win) then
  172.                         @min = @pos - @nastro_win
  173.                 end
  174.         end
  175. end
  176.  
  177. class Stato
  178.         INIZIALE = 0
  179.         FINALE = -1
  180.  
  181.         def initialize(stato = INIZIALE)
  182.                 self.value = stato.to_i
  183.                 @haltState = false
  184.         end
  185.         def value=(stato)
  186.                 @value = stato.to_i
  187.         end
  188.         def value
  189.                 @value
  190.         end
  191.         def setHalt
  192.                 @haltState = true
  193.         end
  194.         def is_halt?
  195.                 @haltState
  196.         end
  197.         def is_iniziale?
  198.                 if @value == INIZIALE then
  199.                         return true
  200.                 else
  201.                         return false
  202.                 end
  203.         end
  204.         def is_finale?
  205.                 if @value <= FINALE then
  206.                         return true
  207.                 else
  208.                         return false
  209.                 end
  210.         end
  211.         def is_ordinario?
  212.                 if @value >= 1 then
  213.                         return true
  214.                 else
  215.                         return false
  216.                 end
  217.         end
  218.         def ==(stato)
  219.                 if(stato.class == Fixnum)
  220.                         if @value == stato.to_s then
  221.                                 return true
  222.                         else
  223.                                 return false
  224.                         end
  225.                 elsif(stato.class == Stato)
  226.                         if @value == stato.value.to_i then
  227.                                 return true
  228.                         else
  229.                                 return false
  230.                         end
  231.                 else
  232.                         return false
  233.                 end
  234.         end
  235.         def to_s
  236.                 str = ""
  237.                 str += "#{self.class}: "
  238.                 if is_halt? then
  239.                         str += "HALT"
  240.                 else
  241.                         str += "#{@value} ("
  242.                         if is_finale? then
  243.                                 str += "FINALE"
  244.                         elsif is_iniziale? then
  245.                                 str += "INIZIALE"
  246.                         else
  247.                                 str += "ORDINARIO"
  248.                         end
  249.                 end
  250.                 str +=")"
  251.                 return str
  252.         end
  253.         def Stato.INIZIALE
  254.                 INIZIALE
  255.         end
  256.         def Stato.FINALE
  257.                 FINALE
  258.         end
  259. end
  260.  
  261. class RegolaIn
  262.         attr_accessor   :stato, :simbolo
  263.         def initialize
  264.                 @stato = Stato.new
  265.                 @simbolo = ""
  266.         end
  267.         def ==(r2)
  268.                 raise ArgumentError.new if r2.class != RegolaIn
  269.                 if (r2.stato == @stato) && (r2.simbolo == @simbolo) then
  270.                         return true
  271.                 else
  272.                         return false
  273.                 end
  274.         end
  275.         def to_s
  276.                 "<Regola in: #{@stato.to_s}, simbolo: #{@simbolo.to_s}>"
  277.         end
  278. end
  279.  
  280. class RegolaOut
  281.         attr_accessor   :id, :stato, :simbolo, :movimento
  282.         def initialize
  283.                 @stato = Stato.new
  284.                 #@simbolo = Simbolo.new
  285.                 @simbolo = ""
  286.                 @movimento = Direzione.NULLA
  287.         end
  288.         def ==(r2)
  289.                 raise ArgumentError.new if r2.class != RegolaIn
  290.                 if (r2.stato == @stato) && (r2.simbolo == @simbolo) && (r2.movimento == @movimento) then
  291.                         return true
  292.                 else
  293.                         return false
  294.                 end
  295.         end
  296.         def to_s
  297.                 "#{self.class}: #{@stato.to_s}, simbolo: #{@simbolo}, movimento: #{Direzione.to_s(@movimento)}"
  298.         end
  299. end
  300.  
  301. class RegolaTransizione
  302.         attr_accessor   :id, :regolaIn, :regolaOut
  303.         def initialize(regolaIn = nil, regolaOut = nil)
  304.                 @id = 0
  305.                 @regolaIn = regolaIn
  306.                 @regolaOut = regolaOut
  307.         end
  308.         def from_s(str)
  309.                 regolaTransizione = RegolaTransizione.getRegolaFromS(str)
  310.                 @id = regolaTransizione.id
  311.                 @regolaIn = regolaTransizione.regolaIn
  312.                 @regolaOut = regolaTransizione.regolaOut
  313.         end
  314.         def to_s
  315.                 return "#{@id}: #{@regolaIn.stato.value} x #{@regolaIn.simbolo} --> #{@regolaOut.stato.value} x #{@regolaOut.simbolo} x #{@regolaOut.movimento.to_s}"
  316.         end
  317.         def RegolaTransizione.getRegolaFromS(str)
  318.                 raise FormatError.new(":String is nil?") if str.nil?
  319.                 if str.downcase =~ /(\d+):\s*(\d|-\d)\s*x\s*(\w)\s*->\s*(\d|-\d)\s*x\s*(\w)\s*x\s*(sinistra|destra|nulla|sx|dx|null|nil|s|d|n)/ then
  320.                         regolaIn = RegolaIn.new
  321.                         regolaIn.stato = Stato.new $2
  322.                         #regolaIn.simbolo = Simbolo.new $3
  323.                         regolaIn.simbolo = $3
  324.                         if ($6== "sinistra") || ($6 == "sx") || ($6 == "s") then
  325.                                 dir = Direzione.SINISTRA
  326.                         elsif ($6 == "destra") || ($6 == "dx") || ($6 == "d") then
  327.                                 dir = Direzione.DESTRA
  328.                         elsif ($6 == "nulla") || ($6 == "null") || ($6 == "nil") || ($6 == "n") then
  329.                                 dir = Direzione.NULLA
  330.                         else
  331.                                 raise FormatError.new
  332.                         end
  333.                         regolaOut = RegolaOut.new
  334.                         regolaOut.stato = Stato.new $4
  335.                         #regolaOut.simbolo = Simbolo.new $5
  336.                         regolaOut.simbolo = $5
  337.                         regolaOut.movimento = dir
  338.                         regolaTransizione = RegolaTransizione.new(regolaIn, regolaOut)
  339.                         #Questo esula dalla concezione OO ma essendo superflua come cosa la lasciamo cosi -- INIZIO
  340.                         regolaTransizione.id = $1.to_i
  341.                         regolaTransizione.regolaOut.id = $1.to_i
  342.                         #Questo esula dalla concezione OO ma essendo superflua come cosa la lasciamo cosi -- FINE
  343.                         return regolaTransizione
  344.                 else
  345.                         raise FormatError.new(str)
  346.                 end
  347.         end
  348. end
  349.  
  350. class Programma
  351.         attr_reader     :numRegole
  352.         def initialize
  353.                 @matriceTransizione = []
  354.                 @numRegole = 1
  355.         end
  356.         def addRegola(regola)
  357.                 raise ArgumentError.new if regola.class != RegolaTransizione
  358.                 @matriceTransizione << regola
  359.                 @numRegole += 1
  360.         end
  361.         def procRegola(regolaIn)
  362.                 raise ArgumentError.new if regolaIn.class != RegolaIn
  363.                 @matriceTransizione.each do |regolaTransizione|
  364.                         if regolaTransizione.regolaIn == regolaIn then
  365.                                 return regolaTransizione.regolaOut
  366.                         end
  367.                 end
  368.                 raise RegolaNonTrovataError.new(regolaIn.to_s)
  369.         end
  370.         def to_s
  371.                 str = ""
  372.                 str += "#{self.class}:\n"
  373.                 @matriceTransizione.each do |regola|
  374.                         str += regola.to_s + "\n"
  375.                 end
  376.                 return str
  377.         end
  378. end
  379.  
  380. class CaricatoreProgramma
  381.         def load(str)
  382.                 raise ArgumentError.new if (str.class != Array) || (str.class != String)
  383.                 if str.class == String then
  384.                         str = str.split "\n"
  385.                 end
  386.                 programma = Programma.new
  387.                 a.each do |r|
  388.                         regolaTransizione = RegolTransizione.new
  389.                         regolaTransizione.from_s(r)
  390.                         programma.addRegola(regolaTransizione)
  391.                 end
  392.                 return programma
  393.         end
  394. end
  395.  
  396. class MdT
  397.         attr_accessor   :programma, :stato, :nastro, :logger, :step_time
  398.         def initialize(programma, stato, nastro, logger)
  399.                 raise ArgumentError.new if (programma.class != Programma)
  400.                 raise ArgumentError.new if (stato.class != Stato)
  401.                 raise ArgumentError.new if (nastro.class != Nastro)
  402.                 raise ArgumentError.new if (logger.class != Logger)
  403.  
  404.                 @programma = programma
  405.                 @stato = stato
  406.                 @nastro = nastro
  407.                 @logger = logger
  408.  
  409.                 @RegolaIn = RegolaIn.new
  410.                 @RegolaOut = RegolaOut.new
  411.  
  412.                 @step = 0
  413.                 @step_time = 0.4
  414.         end
  415.         def step_time=(time)
  416.                 @step_time = time.to_f
  417.         end
  418.         def run
  419.                 @logger.puts "\nINIZIO COMPUTAZIONE"
  420.                 @logger.puts self.inspect
  421.                 @logger.puts @nastro
  422.                 while( (!@stato.is_finale?) && (!@stato.is_halt?) )do
  423.                         procPasso
  424.                 end
  425.                 @logger.puts "\nFINE COMPUTAZIONE"
  426.                 @logger.puts self.to_s
  427.                 @logger.puts @nastro
  428.         end
  429.         def procPasso
  430.                 @regolaIn = getRegolaIn
  431.                 begin
  432.                         @regolaOut = @programma.procRegola(@regolaIn)
  433.                         procRegolaOut @regolaOut
  434.                         @step +=1
  435.                         printComputazione
  436.                         stepAction
  437.                 rescue RegolaNonTrovataError => e
  438.                         @logger.puts "Regola non trovata: <#{@regolaIn.stato.value} x #{@regolaIn.simbolo.to_s}>. La MdT và in HALT"
  439.                         @stato.setHalt
  440.                 end
  441.         end
  442.         def to_s
  443.                 "La MdT si trova in stato [#{@stato}], simbolo [#{@nastro.read}], posizione [#{@nastro.pos}], numero passi [#{@step}]"
  444.         end
  445.         def inspect
  446.                 "#<#{self.class}: [#{@stato}, testina: [ pos: #{@nastro.pos}, simbolo: #{@nastro.read}]>"
  447.         end
  448.         def close
  449.                 @logger.closeAll
  450.         end
  451.  
  452.         private
  453.         def getRegolaIn
  454.                 regolaIn = RegolaIn.new
  455.                 regolaIn.stato = @stato
  456.                 #regolaIn.simbolo = @nastro.getCell(@testina.pos)
  457.                 regolaIn.simbolo = @nastro.read
  458.                 return regolaIn
  459.         end
  460.         def getRegolaOut(regolaIn)
  461.                 raise ArgumentError if regolaIn.class != RegolaIn
  462.                 regolaOut = @programma.procRegola(regolaIn)
  463.                 return regolaOut
  464.         end
  465.         def procRegolaOut(regolaOut)
  466.                 raise ArgumentError if regolaOut.class != RegolaOut
  467.                 @stato = regolaOut.stato
  468.                 #@nastro.setCell(@testina.pos, regolaOut.simbolo)
  469.                 @nastro.write(regolaOut.simbolo)
  470.                 #@testina.muovi(regolaOut.movimento)
  471.                 @nastro.muovi(regolaOut.movimento)
  472.         end
  473.         def printComputazione
  474.                 @logger.puts "-"*30
  475.                 @logger.puts "Passo ##{@step}"
  476.                 @logger.puts "[Regola n. #{@regolaOut.id}] #{@regolaIn.stato.value} x #{@regolaIn.simbolo} --> #{@regolaOut.stato.value} x #{@regolaOut.simbolo} x #{@regolaOut.movimento.to_s}"
  477.                 #@logger.puts "NASTRO : #{@nastro.to_s}"
  478.                 @logger.puts "#{@nastro.to_s}"
  479.                 @logger.puts "-"*30
  480.         end
  481.         def stepAction
  482.                 sleepStepTime()
  483.         end
  484.         def sleepStepTime()
  485.                 sleep @step_time
  486.         end
  487. end
  488.  
  489. class MainController
  490.         def initialize(mdtConfFile = nil)
  491.                 @logger = Logger.new
  492.                 @logger.addLog $stdout
  493.                 @console = Console.new($stdin)
  494.  
  495.                 @programma = Programma.new
  496.                 @stato = Stato.new
  497.                 @nastro = Nastro.new
  498.  
  499.                 @mdtBase = MdT.new @programma, @stato, @nastro, @logger
  500.                 @mdt = MdT.new @programma, @stato, @nastro, @logger
  501.  
  502.                 if !mdtConfFile.nil? then
  503.                         readConfFile(mdtConfFile)
  504.                 end
  505.  
  506.                 @mdt = MdT.new @programma, @stato, @nastro, @logger
  507.         end
  508.         def mainLoop
  509.                 loop do
  510.                         print "comando: "
  511.                         cmd = @console.gets.chomp!
  512.                         procCmd(cmd)
  513.                 end
  514.         end
  515.         private
  516.         def readConfFile(pathname)
  517.                 begin
  518.                         f = File.open pathname
  519.                         ar = f.readlines
  520.                         f.close
  521.                         ar = ar - [""]
  522.                         ar.each { |cmd| procCmd(cmd.chomp!) }
  523.                 rescue FormatError => e
  524.                         Logger.puts "Errore di Formato del file #{pathname}. [#{e.inspect}"
  525.                 rescue StandardError => e
  526.                         Logger.puts "Errore nella lettura del file #{pathname}. [#{e.inspect}]"
  527.                 end
  528.         end
  529.         def procCmd(cmd)
  530.                 raise FormatError.new(":String is nil") if cmd.nil?
  531.                 cmd_downcase = cmd.downcase
  532.                 if cmd_downcase =~ /add\s+(.+)/ then
  533.                         addRegola($1)
  534.                 elsif cmd_downcase =~ /set\s+(stato|nastro|nastro_win|step_time|blank)\s+(.+)/
  535.                         setComponent($1,$2)
  536.                 elsif cmd_downcase =~ /view\s+(programma|stato|nastro|nastro_win|step_time|blank|all)/ then
  537.                         viewComponent($1)
  538.                 #QUESTO VA DOPO PERCHE ALTRIMENTI INTERCETTA I COMANDI "VIEW" CON ARGOMENTO
  539.                 elsif cmd_downcase =~ /view/ then
  540.                         viewComponent("all")
  541.                 ##########################################################################
  542.                 elsif cmd_downcase =~ /reset\s+(programma|stato|nastro|testina|all)/ then
  543.                         resetComponent($1)
  544.                 elsif cmd_downcase == "run" then
  545.                         @mdt.run
  546.                 elsif cmd_downcase == "step" then
  547.                         @mdt.procPasso
  548.                 elsif cmd_downcase == "exit" then
  549.                         @mdt.close
  550.                         controllerExit(0, $hstr)
  551.                 elsif cmd_downcase =~ /output (.+)/ then
  552.                         begin
  553.                                 f = File.new $1, "w"
  554.                         rescue
  555.                                 Logger.puts "Errore nell'apertura del file"
  556.                         end
  557.                         @mdt.logger.addLog(f)
  558.                 elsif cmd_downcase == "about" then
  559.                         globalM_Authors
  560.                 elsif cmd_downcase == "help" then
  561.                         @mdt.logger.puts "Lista comandi:"
  562.                         @mdt.logger.puts " add <stato> x <simbolo> -> <stato> x <simbolo> x <movimento> - Aggiunge una regola al programma"
  563.                         @mdt.logger.puts " set <componente> <valore> - cambia le configurazioni del componente"
  564.                         @mdt.logger.puts " view / view <componente> - visualizza il componente, o tutti se si omette il parametro"
  565.                         @mdt.logger.puts " load <file> - usa il file come sorgente per l'immissione di comandi"
  566.                         @mdt.logger.puts " output <file> - aggiunge il file alla lista di output"
  567.                         @mdt.logger.puts " step - esegue un singolo passo computazionale"
  568.                         @mdt.logger.puts " run - avvia il processo computazionale fino a giungere allo stato finale o HALT"
  569.                         @mdt.logger.puts " reset <componente> / reset all - resetta il componente / resetta tutta la MdT"
  570.                         @mdt.logger.puts " about - informazioni sul programma e l'autore"
  571.                         @mdt.logger.puts " exit - esce dal programma"
  572.                 elsif cmd_downcase =~ /rload\s+(\w+)/ then
  573.                         resetComponent("all")
  574.                         readConfFile($1)
  575.                 elsif cmd_downcase =~ /load\s+(\w+)/ then
  576.                         readConfFile($1)
  577.                 else
  578.                         @mdt.logger.puts "Comando sconosciuto. 'help' per lista comandi."
  579.                 end
  580.         end
  581.         def controllerExit(code, str = "")
  582.                 Logger.print str +"\n"
  583.                 exit code
  584.         end
  585.  
  586.         private
  587.         def setComponent(strDef, par)
  588.                 lstrDef = strDef.to_s
  589.                 lpar = par.to_s
  590.                 if (lstrDef == "stato") && (lpar =~ /\d+/) then
  591.                         @mdt.stato.value = tmpStr
  592.                         #@mdt.logger.puts "updated: #{@mdt.stato}"
  593.                 elsif (lstrDef == "nastro") then
  594.                         if(lpar =~ /(.+)\s+(\d+)/) then
  595.                                 @mdt.nastro.from_s($1, $2)
  596.                         elsif(lpar =~ /(.+)/) then
  597.                                 @mdt.nastro.from_s($1)
  598.                         end
  599.                         #@mdt.logger.puts "updated: #{@mdt.nastro}.inspect"
  600.                 elsif (lstrDef == "blank") && (lpar =~ /(.)/) then
  601.                         @mdt.nastro.blank = lpar
  602.                         #@mdt.logger.puts "Blank = #{@mdt.nastro.blank}"
  603.                 elsif (lstrDef == "nastro_win") && (lpar =~ /(\d+)/) then
  604.                         @mdt.nastro.nastro_win = lpar
  605.                 elsif (lstrDef == "step_time") && (lpar =~ /(\d+)/) then
  606.                         @mdt.step_time = lpar
  607.                 end
  608.         end
  609.         def viewComponent(strDef)
  610.                 lstrDef = strDef.to_s
  611.                 if (lstrDef == "stato") then
  612.                         @mdt.logger.puts @mdt.stato
  613.                 elsif (lstrDef == "nastro") then
  614.                         @mdt.logger.puts @mdt.nastro
  615.                 elsif (lstrDef == "programma") then
  616.                         @mdt.logger.puts @mdt.programma
  617.                 elsif (lstrDef == "blank") then
  618.                         @mdt.logger.puts "Blank: #{@mdt.nastro.blank}"
  619.                 elsif (lstrDef == "step_time") then
  620.                         @mdt.logger.puts "Step time: #{@mdt.step_time}"
  621.                 elsif (lstrDef == "nastro_win") then
  622.                         @mdt.logger.puts "Nastro Win: #{@mdt.nastro.nastro_win}"
  623.                 elsif (lstrDef == "all") then
  624.                         @mdt.logger.puts @mdt.stato
  625.                         @mdt.logger.puts @mdt.programma
  626.                         @mdt.logger.puts @mdt.nastro.inspect
  627.                 end
  628.         end
  629.         def resetComponent(strDef)
  630.                 lstrDef = strDef.to_s
  631.                 if (lstrDef == "stato") then
  632.                         @mdt.stato = Stato.new
  633.                         #@mdt.logger.puts "Reset done: #{@mdt.stato}"
  634.                 elsif (lstrDef == "nastro") then
  635.                         @mdt.nastro = MemoriaNastro.new
  636.                         #@mdt.logger.puts "Reset done: #{@mdt.nastro}"
  637.                 elsif (lstrDef == "programma") then
  638.                         @mdt.programma = Programma.new
  639.                         #@mdt.logger.puts "Reset done: #{@mdt.programma}"
  640.                 elsif (lstrDef == "all") then
  641.                         @mdt.stato = Stato.new
  642.                         @mdt.nastro = Nastro.new
  643.                         @mdt.programma = Programma.new
  644.                         @mdt.logger.puts "Reset totale"
  645.                 end
  646.         end
  647.         def addRegola(str)
  648.                 lstr = str.to_s
  649.                 regolaTransizione = RegolaTransizione.new
  650.                 begin  
  651.                         regolaTransizione.from_s("#{@mdt.programma.numRegole.to_s}: #{lstr}")
  652.                         @mdt.programma.addRegola(regolaTransizione)
  653.                         @mdt.logger.puts "Regola aggiunta."
  654.                 rescue FormatError => e
  655.                         @mdt.logger.puts "Formato regola errato. 'help' per lista comandi."
  656.                 end
  657.         end
  658. end
  659.  
  660. begin
  661.         #mainLoop
  662.         mainController = MainController.new(ARGV.first)
  663.         mainController.mainLoop
  664. rescue Interrupt
  665.         puts "Interrupt catched...exiting"
  666.         exit -1
  667. end