Advertisement
DavidsonDFGL

Interpretador

Sep 23rd, 2013
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.56 KB | None | 0 0
  1.    import jnpout32.*;
  2.    import java.util.ArrayList;
  3.    import java.util.regex.Pattern;
  4.    import java.io.*;
  5.    import java.lang.*;
  6.  
  7.    public class Interpretador
  8.    {
  9.       private ArrayList<Byte> varNum    = new ArrayList<>();
  10.       private ArrayList<String> varNome = new ArrayList<>();
  11.       private RandomAccessFile arquivo;
  12.    
  13.       Interpretador()
  14.       {
  15.      
  16.       }
  17.    
  18.    /**
  19.    * processa todos os simbolos lidos no arquivo
  20.    */
  21.       private boolean processSimbol()
  22.       {
  23.          boolean stop = false;
  24.          String symb = "";
  25.          char tmp;
  26.          try
  27.          {
  28.             do
  29.             {
  30.                tmp = (char)arquivo.readByte();
  31.                if(tmp != '\n' && tmp != '.')
  32.                {
  33.                   symb += tmp;
  34.                }
  35.             }while(tmp != '(' && tmp != '=' && tmp != '\n' && tmp != '.');
  36.          
  37.          //se simbolo lido == vazio, chegou fim arquivo
  38.             if(!symb.equals(""))
  39.             {    
  40.             // ** checa palavras reservadas **
  41.                switch(symb)
  42.                {
  43.                   case "NAND(":
  44.                      NAND();
  45.                      break;
  46.                   case "NOT(":
  47.                      NOT();
  48.                      break;
  49.                   case "OR(":
  50.                      OR();
  51.                      break;
  52.                   case "SUM(":
  53.                      SUM();
  54.                      break;
  55.                }
  56.            
  57.             //** verifica se é variavel **
  58.                if(symb.charAt(symb.length()-1) == '=')
  59.                {
  60.                //remove o sinal '='
  61.                   symb = symb.substring(0,symb.length()-1);
  62.                   String symbTemp = "";
  63.                   byte numeroVar = 0;
  64.                
  65.                //obtem o numero da variavel
  66.                   do
  67.                   {
  68.                      tmp = (char)arquivo.readByte();
  69.                      if(tmp != '\n' && tmp != '.' && tmp != ';')
  70.                      {
  71.                         symbTemp += tmp;
  72.                      }
  73.                   }while(tmp != '\n' && tmp != '.');
  74.                
  75.                   try
  76.                   {
  77.                      numeroVar = (byte)Integer.parseInt(symbTemp);
  78.                  
  79.                      if(!chgVar(symb,numeroVar))
  80.                      {
  81.                         createVar(symb, numeroVar);
  82.                      }
  83.                   }
  84.                      catch(NumberFormatException nfe)
  85.                      {
  86.                         System.out.println("ErRor: So entendo numeros, tente novamente mais tarde");
  87.                      }
  88.                }  
  89.             }
  90.             else
  91.             {
  92.                stop = true;
  93.             }
  94.          }
  95.             catch(IOException ioe)
  96.             {
  97.                System.out.println("ErRor: Arquivo de entrada invalido, corrija-o");
  98.             }
  99.          return stop;
  100.       }
  101.    
  102.    //=============================================================
  103.    //=============== Manipulacao das variaveis ===================
  104.    //=============================================================
  105.    
  106.       private byte getVar(String nome)
  107.       {
  108.          byte ret = 0;
  109.      
  110.          for(int i=0; i<varNome.size(); i++)
  111.          {
  112.             if( nome.equals(varNome.get(i)) )
  113.             {
  114.                ret = varNum.get(i);
  115.                i=varNum.size();
  116.             }
  117.          }
  118.          return ret;
  119.       }
  120.    
  121.       private boolean varExists(String nome)
  122.       {
  123.          boolean exist = false;
  124.      
  125.          for(int i=0; i<varNome.size(); i++)
  126.          {
  127.             if( nome.equals(varNome.get(i)) )
  128.             {
  129.                exist = true;
  130.                i=varNome.size();
  131.             }
  132.          }
  133.          return exist;
  134.       }
  135.    
  136.       private boolean chgVar(String nome, byte n)
  137.       {
  138.          boolean success = false;
  139.          for(int i=0; i<varNome.size(); i++)
  140.          {
  141.             if( nome.equals(varNome.get(i)) )
  142.             {
  143.                varNum.set(i, (byte)n );
  144.                success = true;
  145.                System.out.println("Variavel alterada: |"+nome+"="+n+"|");
  146.                i=varNome.size();
  147.             }
  148.          }
  149.          return success;
  150.       }
  151.    
  152.       private void createVar(String nome, byte n)
  153.       {
  154.          varNum.add( (byte)n );
  155.          varNome.add( nome );
  156.          System.out.println("Variavel criada: |"+nome+"="+n+"|");
  157.       }
  158.    
  159.       private void statusVar()
  160.       {
  161.          if(varNum.size() > 0)
  162.          {
  163.             System.out.print("\nVariaveis: ");
  164.             for(int i=0; i<varNum.size(); i++)
  165.             {
  166.                System.out.print(varNome.get(i) + "=" + varNum.get(i) + " // ");
  167.             }
  168.             System.out.print("\n");
  169.          }
  170.       }
  171.    
  172.    //=============================================================
  173.    //=========== Entrada/Saida ===================================
  174.    //=============================================================
  175.    
  176.       private void pause()
  177.       {
  178.          BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  179.      
  180.          try
  181.          {
  182.             System.out.print("Enviar para porta [ENTER]");
  183.             in.read();
  184.          }
  185.             catch(IOException ioe)
  186.             {
  187.                System.out.println("Erro de E/S!"); 
  188.             }
  189.       }
  190.    
  191.       private void do_read()
  192.       {
  193.          pPort lpt = new pPort();
  194.          short dado = (short) lpt.input((short)(0x378));
  195.          System.out.println("Lendo da porta: " + Integer.toString(dado));
  196.       }
  197.    
  198.       private void do_write(short dado)
  199.       {
  200.          pPort lpt = new pPort();
  201.          System.out.println("Escrevendo na porta: "+  Integer.toString(dado));
  202.          lpt.output((short)(0x378),dado);
  203.       }
  204.    
  205.    //=============================================================
  206.    //=========== Obtencao dos argumentos  ========================
  207.    //=============================================================
  208.    
  209.       private String getArgs()
  210.       {
  211.          String args = "";
  212.          char tmp = ' ';
  213.      
  214.          try
  215.          {
  216.             do
  217.             {
  218.                do
  219.                {
  220.                   tmp = (char)arquivo.readByte();
  221.                   if( (tmp >= 'a' && tmp <= 'z') || (tmp >= 'A' && tmp <= 'z') )
  222.                   {
  223.                      args += tmp;
  224.                   }
  225.                }while((tmp >= 'a' && tmp <= 'z') || (tmp >= 'A' && tmp <= 'z'));
  226.            
  227.                if(tmp == ',' || tmp == ')') args = args + "\n";
  228.             }while(tmp != '\n');
  229.          }
  230.             catch(IOException ioe)
  231.             {
  232.                System.out.println("Parsing ErRor, codigo fonte invalido!:"+ioe.getStackTrace());
  233.             }
  234.      
  235.          return args;
  236.       }
  237.    
  238.    //=============================================================
  239.    //=========== Manipulacao individual da cada funcao ===========
  240.    //=============================================================
  241.    
  242.       private void NAND()
  243.       {
  244.       //prossegue com a leitura da linha, apos o (
  245.          char tmp = ' ';
  246.          String[] args = getArgs().split(Pattern.quote("\n"));
  247.      
  248.          if(!varExists(args[0]) || !varExists(args[1]))
  249.          {
  250.             System.out.println("ErRor: Variavel(is) nao existe!, impossivel realizar operacao NAND");
  251.          }
  252.          else
  253.          {
  254.          //preparacao do numero para envio na porta
  255.             byte a,b,porta;
  256.          
  257.             porta = 0;
  258.             a = getVar(args[0]);
  259.             b = getVar(args[1]);
  260.          
  261.             a <<= 2;
  262.             b <<= 3;
  263.          
  264.             porta = (byte)(a | porta);
  265.             porta = (byte)(b | porta);
  266.          
  267.             System.out.print("============== Porta NAND ==============");
  268.             statusVar();
  269.             System.out.println("porta="+porta);
  270.          
  271.             pause();
  272.             do_write((short)porta);
  273.          
  274.             System.out.print("========================================\n");    
  275.          }
  276.       }
  277.    
  278.       private void NOT()
  279.       {
  280.       //prossegue com a leitura da linha, apos o (
  281.          char tmp = ' ';
  282.          String[] args = getArgs().split(Pattern.quote("\n"));
  283.            
  284.          if(!varExists(args[0]))
  285.          {
  286.             System.out.println("ErRor: Variavel nao existe!, impossivel realizar operacao NOT");
  287.          }
  288.          else
  289.          {
  290.          //preparacao do numero para envio na porta
  291.             byte a,b,porta;
  292.          
  293.             porta = 2;
  294.             a = getVar(args[0]);
  295.          
  296.             a <<= 2;
  297.          
  298.             porta = (byte)(a | porta);
  299.          
  300.             System.out.print("============== Porta NOT ===============");
  301.             statusVar();
  302.             System.out.println("porta="+porta);
  303.          
  304.             pause();
  305.             do_write((short)porta);
  306.            
  307.             System.out.print("========================================\n");
  308.          }
  309.       }
  310.    
  311.       private void OR()
  312.       {
  313.       //prossegue com a leitura da linha, apos o (
  314.          char tmp = ' ';
  315.          String[] args = getArgs().split(Pattern.quote("\n"));
  316.            
  317.          if(!varExists(args[0]) || !varExists(args[1]))
  318.          {
  319.             System.out.println("ErRor: Variavel(is) nao existe!, impossivel realizar operacao OR");
  320.          }
  321.          else
  322.          {
  323.          //preparacao do numero para envio na porta
  324.             byte a,b,porta;
  325.          
  326.             porta = 01;
  327.             a = getVar(args[0]);
  328.             b = getVar(args[1]);
  329.          
  330.             a <<= 2;
  331.             b <<= 3;
  332.          
  333.             porta = (byte)(a | porta);
  334.             porta = (byte)(b | porta);
  335.          
  336.             System.out.print("=============== Porta OR ===============");
  337.             statusVar();
  338.             System.out.println("porta="+porta);
  339.          
  340.             pause();
  341.             do_write((short)porta);
  342.          
  343.             System.out.print("========================================\n");
  344.          }
  345.       }
  346.    
  347.       private void SUM()
  348.       {
  349.       //prossegue com a leitura da linha, apos o (
  350.          char tmp = ' ';
  351.          String[] args = getArgs().split(Pattern.quote("\n"));
  352.            
  353.          if(!varExists(args[0]) || !varExists(args[1]))
  354.          {
  355.             System.out.println("ErRor: Variavel(is) nao existe!, impossivel realizar operacao SUM");
  356.          }
  357.          else
  358.          {
  359.          //preparacao do numero para envio na porta
  360.             byte a,b,porta;
  361.          
  362.             porta = 3;
  363.             a = getVar(args[0]);
  364.             b = getVar(args[1]);
  365.          
  366.             a <<= 2;
  367.             b <<= 3;
  368.          
  369.             porta = (byte)(a | porta);
  370.             porta = (byte)(b | porta);
  371.            
  372.             System.out.print("============== Porta SUM ===============");
  373.             statusVar();
  374.             System.out.println("porta="+porta);
  375.          
  376.             pause();
  377.             do_write((short)porta);
  378.            
  379.             System.out.print("========================================\n");
  380.          }
  381.       }
  382.    
  383.       public void StepByStep(String fileName)
  384.       {
  385.          boolean stop = false;
  386.      
  387.          try
  388.          {
  389.             arquivo = new RandomAccessFile(new File(fileName), "r");
  390.          }
  391.             catch(FileNotFoundException fnfe)
  392.             {
  393.                System.out.println("Error: Arquivo nao encontrado!");
  394.             }
  395.      
  396.          do
  397.          {
  398.             stop = processSimbol();
  399.          }while(!stop);
  400.      
  401.       }
  402.    }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement