コード例 #1
0
        private static bool CurrentTokenIs(params object[] objs)
        {
            CurrentToken = Lexico.NextToken();
            string erros = "";

            foreach (var item in objs)
            {
                if (item is Tag)
                {
                    if (CurrentToken.Tag == (Tag)item)
                    {
                        return(true);
                    }
                    erros += item + ", ";
                }
                else if (CurrentToken.Equals(item))
                {
                    return(true);
                }
                else
                {
                    erros += item + ", ";
                }
            }
            erros += "a";
            erros  = erros.Replace(", a", string.Empty);
            Error(erros);
            return(false);
        }
コード例 #2
0
        private static void Lista_arg(Simbolo pEsq)
        {
            var parametros = TabelaDeSimbolos.BuscaParametros(pEsq);

            if (Lexico.NextTokenIs('('))
            {
                CurrentToken = Lexico.NextToken();
                Argumentos();

                if (parametros.Count() != FilaSimbolos.Count())
                {
                    pEsq.SetMsgErro(MsgErrosSemanticos.PARAMETROS_INCORRETOS, parametros.Count(), FilaSimbolos.Count());
                    Error(pEsq);
                }
                while (FilaSimbolos.Any())
                {
                    var sim   = FilaSimbolos.Dequeue();
                    var param = parametros.Dequeue();
                    if (sim.Tipo != param.Tipo)
                    {
                        pEsq.SetMsgErro(MsgErrosSemanticos.PARAMETRO_ERRADO, sim, param);
                        Error(pEsq);
                    }
                    MaqHip.C.Add("PARAM " + sim.EnderecoRelativo);
                }
                CurrentTokenIs(')');
            }
            if (parametros.Count() != 0)
            {
                pEsq.SetMsgErro(MsgErrosSemanticos.PARAMETROS_INCORRETOS, parametros.Count(), 0);
                Error(pEsq);
            }
        }
コード例 #3
0
 private static void Mais_dc()
 {
     if (Lexico.NextTokenIs(';'))
     {
         CurrentToken = Lexico.NextToken();
         Dc();
     }
 }
コード例 #4
0
 private static void Mais_par()
 {
     if (Lexico.NextTokenIs(';'))
     {
         CurrentToken = Lexico.NextToken();
         Lista_par();
     }
 }
コード例 #5
0
 private static void Dc_loc()
 {
     if (Lexico.NextTokenIs("var"))
     {
         Dc_v();
         Mais_dcloc();
     }
 }
コード例 #6
0
 private static void Pfalsa()
 {
     if (Lexico.NextTokenIs("else"))
     {
         CurrentToken = Lexico.NextToken();
         Comandos();
     }
 }
コード例 #7
0
 private static void Mais_comandos()
 {
     if (Lexico.NextTokenIs(';'))
     {
         CurrentToken = Lexico.NextToken();
         Comandos();
     }
 }
コード例 #8
0
 private static void Mais_ident()
 {
     if (Lexico.NextTokenIs(';'))
     {
         CurrentToken = Lexico.NextToken();
         Argumentos();
     }
 }
コード例 #9
0
 private static void Mais_var(bool novo = true)
 {
     if (Lexico.NextTokenIs(','))
     {
         CurrentToken = Lexico.NextToken();
         Variaveis(novo);
     }
 }
コード例 #10
0
 private static char?Op_un()
 {
     if (Lexico.NextTokenIs('+') || Lexico.NextTokenIs('-'))
     {
         CurrentToken = Lexico.NextToken();
         return((char)CurrentToken.Lexema);
     }
     return(null);
 }
コード例 #11
0
 private static void Parametros()
 {
     if (Lexico.NextTokenIs('('))
     {
         CurrentToken = Lexico.NextToken();
         Categoria    = "param";
         Lista_par();
         CurrentTokenIs(')');
     }
 }
コード例 #12
0
 private static Simbolo Outros_termos(Simbolo pEsq)
 {
     if (Lexico.NextTokenIs('+') || Lexico.NextTokenIs('-'))
     {
         var inst = Op_ad();
         var tDir = Termo(pEsq);
         MaqHip.C.Add(inst);
         var oDir = Outros_termos(tDir);
         return(oDir);
     }
     return(pEsq);
 }
コード例 #13
0
 private static Simbolo Mais_fatores(Simbolo pEsq)
 {
     if (Lexico.NextTokenIs('*') || Lexico.NextTokenIs('/'))
     {
         var inst = Op_mul();
         var fDir = Fator(pEsq);
         MaqHip.C.Add(inst);
         var mDir = Mais_fatores(fDir);
         return(mDir);
     }
     return(pEsq);
 }
コード例 #14
0
 private static void Dc()
 {
     Escopo = "";
     if (Lexico.NextTokenIs("var"))
     {
         Dc_v();
         Mais_dc();
     }
     else if (Lexico.NextTokenIs("procedure"))
     {
         Dc_p();
         Mais_dc();
     }
 }
コード例 #15
0
        private void BtnCompilar_Click(object sender, RoutedEventArgs e)
        {
            var sourceCode = new TextRange(CodigoFonte.Document.ContentStart, CodigoFonte.Document.ContentEnd).Text;

            if (sourceCode == "" || sourceCode == "\r\n")
            {
                MessageBox.Show("Não há nada para ser compilado!\nPor favor digite um código fonte.", "Atenção!", MessageBoxButton.OK, MessageBoxImage.Information);
                return;
            }

            Lexico.ScanText(sourceCode);
            if (Lexico.ContemErroLexico)
            {
                var erros = Lexico.Tokens.Where(t => t.Tag == SimpleCompiler.Tag.ERRO_LEXICO).ToList();
                Console.Text = ErroLexico(erros);
            }
            else if (Lexico.Tokens.Any())
            {
                try
                {
                    Sintatico.Analyze();

                    var sucesso = "Análise Léxica ✓\r\nAnálise Sintática ✓\r\nAnálise Semântica ✓\r\n\r\nHora: " + DateTime.Now.ToLongTimeString();
                    Console.Text = sucesso;
                    var janelaInstrucoes = new Instrucoes();
                    janelaInstrucoes.Show();
                    Console.Text += "\r\n\r\nExecução:\r\n";
                    MaquinaHipotetica.GetInstance().ExecutarPrograma(Console);
                }
                catch (Exception ex)
                {
                    if (ex.Message.Contains("#sintatico#"))
                    {
                        Console.Text = ErroSintatico(ex.Message);
                    }
                    else
                    {
                        Console.Text = ErroSemantico(ex.Message);
                    }
                }
            }
            else
            {
                var sucesso = "Análise Léxica ✓\r\nApenas Comentários...\r\n\r\nHora: " + DateTime.Now.ToLongTimeString();
                Console.Text = sucesso;
            }
        }
コード例 #16
0
 private static void RestoIdent(Simbolo pEsq)
 {
     if (Lexico.NextTokenIs(":="))
     {
         CurrentToken = Lexico.NextToken();
         Expressao(pEsq);
         MaqHip.C.Add("ARMZ " + pEsq.EnderecoRelativo);
     }
     else
     {
         int retorno = MaqHip.C.Count();
         MaqHip.C.Add("PUSHER");
         Lista_arg(pEsq);
         MaqHip.C.Add("CHPR " + pEsq.PrimeiraInstrucao);
         MaqHip.C[retorno] = "PUSHER " + MaqHip.C.Count();
     }
 }
コード例 #17
0
 private static void Comando()
 {
     CurrentToken = Lexico.NextToken();
     if (CurrentToken.Equals("if"))
     {
         Condicao();
         int pos = MaqHip.C.Count();
         MaqHip.C.Add("DSVF");
         if (CurrentTokenIs("then"))
         {
             Comandos();
             MaqHip.C[pos] = "DSVF " + (MaqHip.C.Count() + 1);
             pos           = MaqHip.C.Count();
             MaqHip.C.Add("DSVI");
             Pfalsa();
             MaqHip.C[pos] = "DSVI " + MaqHip.C.Count();
             CurrentTokenIs('$');
         }
     }
     else if (CurrentToken.Equals("while"))
     {
         int inicio = MaqHip.C.Count();
         Condicao();
         if (CurrentTokenIs("do"))
         {
             int loop = MaqHip.C.Count();
             MaqHip.C.Add("DSVF");
             Comandos();
             MaqHip.C.Add("DSVI " + inicio);
             MaqHip.C[loop] = "DSVF " + MaqHip.C.Count();
             CurrentTokenIs('$');
         }
     }
     else if (CurrentToken.Equals("read") || CurrentToken.Equals("write"))
     {
         var isRead = CurrentToken.Equals("read");
         if (CurrentTokenIs('('))
         {
             Variaveis(false);
             var tipo = "";
             while (FilaSimbolos.Any())
             {
                 var simbolo = FilaSimbolos.Dequeue();
                 var s       = TabelaDeSimbolos.Busca(simbolo);
                 if (s == null)
                 {
                     simbolo.SetMsgErro(MsgErrosSemanticos.NAO_DECLARADO);
                     Error(simbolo);
                 }
                 if (tipo == "")
                 {
                     tipo = s.Tipo;
                 }
                 else if (tipo != s.Tipo)
                 {
                     simbolo.SetMsgErro(MsgErrosSemanticos.TIPOS_DIFERENTES, tipo);
                     Error(simbolo);
                 }
                 if (isRead)
                 {
                     MaqHip.C.Add("LEIT");
                     MaqHip.C.Add("ARMZ " + s.EnderecoRelativo);
                 }
                 else
                 {
                     MaqHip.C.Add("CRVL " + s.EnderecoRelativo);
                     MaqHip.C.Add("IMPR");
                 }
             }
             CurrentTokenIs(')');
         }
     }
     else if (CurrentToken.Tag == Tag.IDENTIFICADOR)
     {
         var simbolo = TabelaDeSimbolos.Busca(CurrentToken.Lexema, Escopo);
         if (simbolo == null)
         {
             Error(new Simbolo(CurrentToken, MsgErrosSemanticos.NAO_DECLARADO));
         }
         simbolo.Token.Linha = CurrentToken.Linha;
         RestoIdent(simbolo);
     }
     else
     {
         Error("if, while, read, write, Identificador");
     }
 }
コード例 #18
0
 private static Simbolo Fator(Simbolo pEsq)
 {
     CurrentToken = Lexico.NextToken();
     if (CurrentToken.Equals('('))
     {
         Expressao(pEsq);
         CurrentTokenIs(')');
     }
     else if (CurrentToken.Tag == Tag.IDENTIFICADOR)
     {
         var simbolo = TabelaDeSimbolos.Busca(CurrentToken.Lexema, Escopo);
         if (simbolo == null)
         {
             Error(new Simbolo(CurrentToken, MsgErrosSemanticos.NAO_DECLARADO));
         }
         if (simbolo.Categoria == "procedure")
         {
             Error(new Simbolo(CurrentToken, MsgErrosSemanticos.NAO_DECLARADO));
         }
         simbolo.Token.Linha = CurrentToken.Linha;
         if (pEsq != null)
         {
             if (simbolo.Tipo != pEsq.Tipo)
             {
                 pEsq.SetMsgErro(MsgErrosSemanticos.ATRIBUICAO_ERRADA, simbolo);
                 Error(pEsq);
             }
             pEsq.Token.Linha = CurrentToken.Linha;
             MaqHip.C.Add("CRVL " + simbolo.EnderecoRelativo);
             return(pEsq);
         }
         MaqHip.C.Add("CRVL " + simbolo.EnderecoRelativo);
         return(simbolo);
     }
     else if (CurrentToken.Tag == Tag.NUMERO_INTEIRO)
     {
         var s = new Simbolo(CurrentToken, Escopo, "", CurrentToken.Lexema, -1);
         MaqHip.C.Add("CRCT " + s.Valor);
         s.Tipo = CurrentToken.GetTagDescription();
         if (pEsq != null)
         {
             if (pEsq.Tipo != "integer")
             {
                 pEsq.SetMsgErro(MsgErrosSemanticos.ATRIBUICAO_ERRADA, s);
                 Error(pEsq);
             }
             pEsq.Token.Linha = CurrentToken.Linha;
             return(pEsq);
         }
         return(s);
     }
     else if (CurrentToken.Tag == Tag.NUMERO_REAL)
     {
         var s = new Simbolo(CurrentToken, Escopo, "", CurrentToken.Lexema, -1);
         MaqHip.C.Add("CRCT " + s.Valor);
         s.Tipo = CurrentToken.GetTagDescription();
         if (pEsq != null)
         {
             if (pEsq.Tipo != "real")
             {
                 pEsq.SetMsgErro(MsgErrosSemanticos.ATRIBUICAO_ERRADA, s);
                 Error(pEsq);
             }
             pEsq.Token.Linha = CurrentToken.Linha;
             return(pEsq);
         }
         return(s);
     }
     else
     {
         Error("N° inteiro, N° real ou identificador");
     }
     return(pEsq);
 }