⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interpretador.cpp

📁 "tiny" language interpreter written in java
💻 CPP
字号:
/*
TP2 LP INTERPRETADOR TINY
ALUNO : ANDRE LUIS DURAO ABDO
MATRICULA : 283999
DATA DA ENTREGA : 10/05/2007
*/ 

//Interpretador.cpp
#include "Interpretador.h"
#include "Comando.h"
#include "ComandoPrint.h"
#include "ComandoPrintln.h"
#include "ComandoReadInt.h"
#include "ComandoEndP.h"
#include "ComandoAtrib.h"
#include "ComandoWhile.h"
#include "ComandoEndW.h"
#include "ComandoGoto.h"
#include "ComandoIf.h"
#include <string>
#include <stack>


Interpretador::Interpretador( const string& str){
    arq = new ArquivoFonte(str);
    mem = new Memoria();
    memRotulos = new Memoria();
}
void Interpretador::leArquivo(){    

	string txt =arq->proximaPalavra(); 
	bool flag=true;
	while (txt!="EOF"&&flag){			
		//PRINT______________________________________________________
		if (txt=="print"){
			//salta "("
			arq->saltaPalavra();
			txt =arq->proximaPalavra();
			//caso for uma String
			if (txt=="'"){					
				txt = arq->proximaPalavra();
				Comando *cmd = new ComandoPrint(txt,true,mem,Vetor.size());
				adicionaComando(cmd);
			}else{										
				Comando *cmd = new ComandoPrint(txt,false,mem,Vetor.size());
				adicionaComando(cmd);
			}
		}else
		//READINT____________________________________________________
		if (txt=="readInt"){
			//salta "("
			arq->saltaPalavra();
			txt = arq->proximaPalavra();
            Comando *cmd = new ComandoReadInt(txt,mem,Vetor.size());
            adicionaComando(cmd);
		}else
		//PRINTLN____________________________________________________
		if (txt=="println" ){
            Comando *cmd = new ComandoPrintln(Vetor.size());
            adicionaComando(cmd);
        }else
		//ENDP____________________________________________________
		if (txt=="endp" ){
            Comando *cmd = new ComandoEndP(Vetor.size());
            adicionaComando(cmd);
            flag=false;
        }else
        //lixo_______________________________________________________
		if (txt=="'" | txt==")"){
			//apenas passa pelo if para evitar de ser entendido como comando de atrib
		}else
		//WHILE______________________________________________________
		if (txt=="while"){
			//salta "("
            arq->saltaPalavra();
			// var1 op var2 ex: x > y
			string var1 = arq->proximaPalavra();
			string comp = arq->proximaPalavra();
			string var2 = arq->proximaPalavra();
            Comando *cmd = new ComandoWhile(mem,var1,comp,var2,Vetor.size());
            pilhaRepeticao.push(Vetor.size());
            adicionaComando(cmd);
            //empilha comando na pilha de repeticoes para saber em qual linha foi
            //inserido de modo que possa retornar sua ultima linha posteriormente
		}else
		//ENDW_______________________________________________________
		if (txt=="endw" ){
            int linhaWhile = pilhaRepeticao.top();

            //ALTERA VALOR DA LINHA DE SALTO DO COMANDO WHILE
            Comando *cmd = Vetor.at(linhaWhile);
            cmd->defineLinhaSalto(Vetor.size());            
            //INSERE COMANDO ENDW NO VETOR
            pilhaRepeticao.pop();
            cmd = new ComandoEndW(mem,Vetor.size(),linhaWhile);
            adicionaComando(cmd);            
		}else		
		//GOTO_______________________________________________________
		if (txt=="goto" ){
            
            //define o nome do rotulo
            string nomeRotulo = arq->proximaPalavra();
            Comando *cmd = new ComandoGoto(memRotulos,nomeRotulo,Vetor.size());
            adicionaComando(cmd);            
		}else		
		//IF_________________________________________________________
		if (txt=="if" ){
            //salta (
			txt = arq->proximaPalavra();
            //define as variaveis e o comparador
            string var1 = arq->proximaPalavra();
            string comp = arq->proximaPalavra();
            string var2 = arq->proximaPalavra();                        
            //salta )
            arq->saltaPalavra();
            //salta goto
            arq->saltaPalavra();
            //define o nome do rotulo
            string nomeRotulo = arq->proximaPalavra();

            Comando *cmd = new ComandoIf(mem,memRotulos,var1,comp,var2,nomeRotulo,Vetor.size());
            adicionaComando(cmd);            
		}else				
		//ATRIB______________________________________________________
		{													
			string op = arq->proximaPalavra();
			//var++ ou var--
			if (op == "+" | op == "-"){
				string op2 = arq->proximaPalavra();
                Comando *cmd = new ComandoAtrib(mem,txt,op,op2,Vetor.size());
                adicionaComando(cmd);				
			}else{
				//a: usado para rotulos
				if (op == ":"){
                    //caso especial: no caso dos rotulos 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -