📄 interpretador.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 + -