private void Fator() { if (tokenAtual.Tipo == TipoToken.VARIAVEL) { VerificarToken(TipoToken.VARIAVEL); pilhaExpressoes.Push(tabelaVariaveis.FirstOrDefault(variavel => variavel.Key == tokenAtual.Nome).Value); string nomeVar = tokenAtual.Nome; tokenAtual = scanner.ProximoToken(); AssemblyInstrucoes.AppendLine($"lw $t5, {nomeVar}"); AssemblyInstrucoes.AppendLine("subu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sw $t5, ($sp)"); AssemblyInstrucoes.AppendLine(); Potencia(); } else if (tokenAtual.Tipo == TipoToken.NUMERO) { VerificarToken(TipoToken.NUMERO); pilhaExpressoes.Push(tokenAtual.Valor); double valor = tokenAtual.Valor; tokenAtual = scanner.ProximoToken(); AssemblyInstrucoes.AppendLine($"li $t5, {valor.ToString()}"); AssemblyInstrucoes.AppendLine("subu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sw $t5, ($sp)"); AssemblyInstrucoes.AppendLine(); Potencia(); } else { VerificarToken(TipoToken.ABRE_PAREN); tokenAtual = scanner.ProximoToken(); Expressao(); VerificarToken(TipoToken.FECHA_PAREN); tokenAtual = scanner.ProximoToken(); Potencia(); } }
private void Potencia() { if (tokenAtual.Tipo == TipoToken.EXP) { VerificarToken(TipoToken.EXP); tokenAtual = scanner.ProximoToken(); Expressao(); operando2 = Convert.ToDouble(pilhaExpressoes.Pop()); operando1 = Convert.ToDouble(pilhaExpressoes.Pop()); resultado = Math.Pow(operando1, operando2); #region Potencia AssemblyInstrucoes.AppendLine("lw $t1, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("lw $t0, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("li $t2, 1"); AssemblyInstrucoes.AppendLine("li $t5, 1"); AssemblyInstrucoes.AppendLine("for:"); AssemblyInstrucoes.AppendLine("beq $t1, $zero, fim"); AssemblyInstrucoes.AppendLine("mul $t2, $t2, $t0"); AssemblyInstrucoes.AppendLine("sub $t1, $t1, $t5"); AssemblyInstrucoes.AppendLine("j for"); AssemblyInstrucoes.AppendLine("fim:"); AssemblyInstrucoes.AppendLine("subu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sw $t2, ($sp)"); #endregion pilhaExpressoes.Push(resultado); } }
private void Instrucao() { if (tokenAtual.Tipo == TipoToken.VARIAVEL) { VerificarToken(TipoToken.VARIAVEL); nomeVariavel = tokenAtual.Nome; tokenAtual = scanner.ProximoToken(); #region Declaração de Variáveis AssemblyVariaveis.Append(nomeVariavel); AssemblyVariaveis.AppendLine(": .word 0"); #endregion VerificarToken(TipoToken.ATRIBUICAO); tokenAtual = scanner.ProximoToken(); Expressao(); double valorExpr = Convert.ToDouble(pilhaExpressoes.Pop()); AdicionarValorTabela(nomeVariavel, valorExpr); #region Desempilhamento e Atribuição AssemblyInstrucoes.AppendLine("lw $t4, ($sp)"); AssemblyInstrucoes.AppendLine($"sw $t4, {nomeVariavel}"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine(); #endregion } else if (tokenAtual.Tipo == TipoToken.ESCREVA) { VerificarToken(TipoToken.ESCREVA); tokenAtual = scanner.ProximoToken(); VerificarToken(TipoToken.ABRE_PAREN); tokenAtual = scanner.ProximoToken(); string saida = ""; ListaArgs(); VerificarToken(TipoToken.FECHA_PAREN); tokenAtual = scanner.ProximoToken(); void ListaArgs() { Argumento(); RestoArgs(); Console.WriteLine(saida); } void RestoArgs() { if (tokenAtual.Tipo == TipoToken.VIRGULA) { VerificarToken(TipoToken.VIRGULA); tokenAtual = scanner.ProximoToken(); Argumento(); RestoArgs(); } else { ; } } void Argumento() { if (tokenAtual.Tipo == TipoToken.VARIAVEL) { VerificarToken(TipoToken.VARIAVEL); nomeVariavel = tokenAtual.Nome; tokenAtual = scanner.ProximoToken(); saida += tabelaVariaveis.FirstOrDefault(variavel => variavel.Key == nomeVariavel).Value + " "; #region Imprimir Variavel AssemblyInstrucoes.AppendLine($"lw $a0, {nomeVariavel}"); AssemblyInstrucoes.AppendLine("li $v0, 1"); AssemblyInstrucoes.AppendLine("syscall"); #endregion } else if (tokenAtual.Tipo == TipoToken.NUMERO) { VerificarToken(TipoToken.NUMERO); saida += tokenAtual.Valor + " "; #region Imprimir Float string NomeVar = "txt" + AssemblyVariaveis.Length; AssemblyVariaveis.AppendLine($"{NomeVar}: .float {tokenAtual.Valor.ToString().Replace(",",".")}"); AssemblyInstrucoes.AppendLine("li $v0, 2"); AssemblyInstrucoes.AppendLine($"l.s $f12, {NomeVar}"); AssemblyInstrucoes.AppendLine("syscall"); #endregion tokenAtual = scanner.ProximoToken(); } else if (tokenAtual.Tipo == TipoToken.STRING) { VerificarToken(TipoToken.STRING); string str = tokenAtual.Nome.Replace("\"", ""); saida += str + " "; #region Imprimir String string NomeVar = "txt" + AssemblyVariaveis.Length; AssemblyVariaveis.AppendLine($"{NomeVar}: .asciiz \"{str}\""); AssemblyInstrucoes.AppendLine("li $v0, 4"); AssemblyInstrucoes.AppendLine($"la $a0, {NomeVar}"); AssemblyInstrucoes.AppendLine("syscall"); #endregion tokenAtual = scanner.ProximoToken(); } } } else if (tokenAtual.Tipo == TipoToken.LEIA) { VerificarToken(TipoToken.LEIA); tokenAtual = scanner.ProximoToken(); VerificarToken(TipoToken.ABRE_PAREN); tokenAtual = scanner.ProximoToken(); VerificarToken(TipoToken.VARIAVEL); nomeVariavel = tokenAtual.Nome; string input = Console.ReadLine(); if (!tabelaVariaveis.ContainsKey(tokenAtual.Nome)) { AssemblyVariaveis.AppendLine($"{tokenAtual.Nome}: .word 0"); } if (input.IsNumber()) { tokenAtual.Valor = Convert.ToDouble(input); AdicionarValorTabela(nomeVariavel, tokenAtual.Valor); } else { tokenAtual.ValorString = input; AdicionarValorTabela(nomeVariavel, tokenAtual.ValorString); } #region Ler Entrada AssemblyInstrucoes.AppendLine("li $v0, 5"); AssemblyInstrucoes.AppendLine("syscall"); AssemblyInstrucoes.AppendLine($"sw $v0, {nomeVariavel}"); #endregion tokenAtual = scanner.ProximoToken(); VerificarToken(TipoToken.FECHA_PAREN); tokenAtual = scanner.ProximoToken(); } }
private void RestoTermo() { if (tokenAtual.Tipo == TipoToken.MULT) { VerificarToken(TipoToken.MULT); tokenAtual = scanner.ProximoToken(); Fator(); operando2 = Convert.ToDouble(pilhaExpressoes.Pop()); operando1 = Convert.ToDouble(pilhaExpressoes.Pop()); resultado = operando1 * operando2; pilhaExpressoes.Push(resultado); #region Multiplicação e Empilhamento AssemblyInstrucoes.AppendLine("lw $t1, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("lw $t0, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("mul $t2, $t0, $t1"); AssemblyInstrucoes.AppendLine("subu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sw $t2, ($sp)"); #endregion RestoTermo(); } else if (tokenAtual.Tipo == TipoToken.DIV) { VerificarToken(TipoToken.DIV); tokenAtual = scanner.ProximoToken(); Fator(); operando2 = Convert.ToDouble(pilhaExpressoes.Pop()); if (operando2 == 0) { Console.WriteLine("Divisão por 0 inválida."); tokenAtual = new Token(TipoToken.ERRO); ListaInstrucoes(); } operando1 = Convert.ToDouble(pilhaExpressoes.Pop()); resultado = operando1 / operando2; pilhaExpressoes.Push(resultado); #region Divisão e Empilhamento AssemblyInstrucoes.AppendLine("lw $t1, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("lw $t0, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("div $t2, $t0, $t1"); AssemblyInstrucoes.AppendLine("subu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sw $t2, ($sp)"); #endregion RestoTermo(); } else if (tokenAtual.Tipo == TipoToken.RESTO) { VerificarToken(TipoToken.RESTO); tokenAtual = scanner.ProximoToken(); Fator(); operando2 = Convert.ToDouble(pilhaExpressoes.Pop()); if (operando2 == 0) { Console.WriteLine("Divisão por 0 inválida."); tokenAtual = new Token(TipoToken.ERRO); ListaInstrucoes(); } operando1 = Convert.ToDouble(pilhaExpressoes.Pop()); resultado = operando1 % operando2; pilhaExpressoes.Push(resultado); #region Resto e Empilhamento AssemblyInstrucoes.AppendLine("lw $t1, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("lw $t0, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("rem $t2, $t0, $t1"); AssemblyInstrucoes.AppendLine("subu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sw $t2, ($sp)"); #endregion RestoTermo(); } else { ; } }
private void RestanteExpressao() { if (tokenAtual.Tipo == TipoToken.SOMA) { VerificarToken(TipoToken.SOMA); tokenAtual = scanner.ProximoToken(); Termo(); //Cálculo operando2 = Convert.ToDouble(pilhaExpressoes.Pop()); operando1 = Convert.ToDouble(pilhaExpressoes.Pop()); resultado = operando1 + operando2; pilhaExpressoes.Push(resultado); #region Soma e Empilhamento AssemblyInstrucoes.AppendLine("lw $t1, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("lw $t0, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("add $t2, $t0, $t1"); AssemblyInstrucoes.AppendLine("subu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sw $t2, ($sp)"); AssemblyInstrucoes.AppendLine(); #endregion RestanteExpressao(); } else if (tokenAtual.Tipo == TipoToken.SUB) { VerificarToken(TipoToken.SUB); tokenAtual = scanner.ProximoToken(); Termo(); //Cálculo operando2 = Convert.ToDouble(pilhaExpressoes.Pop()); operando1 = Convert.ToDouble(pilhaExpressoes.Pop()); resultado = operando1 - operando2; pilhaExpressoes.Push(resultado); #region Subtração e Empilhamento AssemblyInstrucoes.AppendLine("lw $t1, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("lw $t0, ($sp)"); AssemblyInstrucoes.AppendLine("addu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sub $t2, $t0, $t1"); AssemblyInstrucoes.AppendLine("subu $sp, $sp, 4"); AssemblyInstrucoes.AppendLine("sw $t2, ($sp)"); AssemblyInstrucoes.AppendLine(); #endregion RestanteExpressao(); } else { ; } }