case PROG_ACAO_DECLARACAO_INT:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
String label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
Descritor d = new Descritor(Tipo.VAR_INT,label,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
buffer.append("\t"+ label + "\tdd\t0\n");
// System.out.print(buffer.toString());
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
}else{
// System.out.println("ja tem: " + label);
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_DECLARACAO_BOOL:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
Descritor d = new Descritor(Tipo.VAR_BOOL,label,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
buffer.append("\t"+ label + "\tdd\t0\n");
// System.out.print(buffer.toString());
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
}else{
// System.out.println("ja tem: " + label);
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_INI_DECLARACAO_VETOR_INT:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
// Guarda id na pilha. Espera-se "[n]" em sequida
Descritor d = new Descritor(Tipo.VAR_INT,label,0,nivelEscopo,true);
pilhaSimbolos.push(d);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
}else{
// System.out.println("ja tem: " + label);
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_RECEBEU_TAM_VETOR:
// Seta o tamanho do vetor no descritor
Descritor d = pilhaSimbolos.peek();
d.setNumParam(token.getIComplementaryInformation());
break;
case PROG_ACAO_FIM_DECLARACAO_VETOR:
// Recebeu valor do numero de elementos do vetor
// Reserva memoria
d = pilhaSimbolos.pop(); // tira simbolo da pilha
label = d.getLabel();
int tam = d.getNumParam();
int num = 0; //getProxNumSerieVetor();
buffer.append("\t"+ label + "\tdd\t" + label + "_"+ num + "\n");
buffer.append("\t"+ label + "_"+ num + "\tdd\t");
for(int i=0; i<tam-1; i++){
buffer.append("0,");
}
buffer.append("0\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
break;
case PROG_ACAO_INI_DECLARACAO_VETOR_BOOL:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
// Guarda id na pilha. Espera-se "[n]" em sequida
d = new Descritor(Tipo.VAR_BOOL,label,0,nivelEscopo,true);
pilhaSimbolos.push(d);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,false);
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_ID_FUNC_INT:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(token);
if(simboloDeclarado(token,false)==null){ //OBS: era !simboloExiste(getTokenAnterior(),false)
d = new Descritor(Tipo.FUNC_INT,label,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(token), d,false);
pilhaSimbolos.push(d); // guarda simbolo
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(token));
}
break;
case PROG_ACAO_INI_FUNC_INT_BOOL:
d = pilhaSimbolos.peek();
d.setNumParam(numParametros); // seta num de parametros
// Gera codigo p/ label da funcao
label = d.getLabel();
funcAtual = label;
buffer.append(label+"\tproc\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
// escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
break;
case PROG_ACAO_INI_FUNC_VOID:
d = pilhaSimbolos.peek();
d.setNumParam(numParametros); // seta num de parametros
// Gera codigo p/ label da funcao
label = d.getLabel();
funcAtual = label;
buffer.append(label+"\tproc\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
// escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
break;
case PROG_ACAO_FUNC_PARAM_INT:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
String func = pilhaSimbolos.peek().getLabel();
String novoLabel = func + "_" + label;
d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
// codigo definindo label (no formato <label_funcao>_<label>)
buffer.append("\t" + novoLabel + "\tdd\t0\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
// escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_FUNC_PARAM_BOOL:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
String func = pilhaSimbolos.peek().getLabel();
String novoLabel = func + "_" + label;
d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
// codigo definindo label (no formato <label_funcao>_<label>)
buffer.append("\t" + novoLabel + "\tdd\t0\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
// escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_FUNC_INI_PARAM_VETOR_INT:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
String func = pilhaSimbolos.peek().getLabel();
String novoLabel = func + "_" + label;
// Guarda id na pilha. Espera-se "[n]" em sequida
d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,true);
pilhaSimbolos.push(d);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_FUNC_PARAM_TAM_VETOR:
// Seta o tamanho do vetor no descritor
d = pilhaSimbolos.peek();
d.setNumParam(token.getIComplementaryInformation());
break;
case PROG_ACAO_FUNC_FIM_PARAM_VETOR:
// Recebeu valor do numero de elementos do vetor
// Reserva memoria
d = pilhaSimbolos.pop(); // tira simbolo da pilha
label = d.getLabel();
tam = d.getNumParam();
num = 0; //getProxNumSerieVetor();
buffer.append("\t"+ label + "\tdd\t" + label + "_"+ num + "\n");
buffer.append("\t"+ label + "_"+ num + "\tdd\t");
for(int i=0; i<tam-1; i++){
buffer.append("0,");
}
buffer.append("0\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
break;
case PROG_ACAO_FUNC_INI_PARAM_VETOR_BOOL:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
String func = pilhaSimbolos.peek().getLabel();
String novoLabel = func + "_" + label;
// Guarda id na pilha. Espera-se "[n]" em sequida
d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,true);
pilhaSimbolos.push(d);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
/*
*Declaracao de variaveis/vetor dentro da funcao
*/
case PROG_ACAO_FUNC_DECLARACAO_INT:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
String novoLabel = funcAtual + "_" + label;
d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
buffer.append("\t"+ novoLabel + "\tdd\t0\n");
// buffer.append("\tLOCAL\t"+ novoLabel + "\t:DWORD\n");
//FIXME: aqui....
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_FUNC_DECLARACAO_BOOL:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
String novoLabel = funcAtual + "_" + label;
d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
// buffer.append("\tLOCAL\t"+ novoLabel + "\t:DWORD\n");
buffer.append("\t"+ novoLabel + "\tdd\t0\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_FUNC_INI_DECLARACAO_VETOR_INT:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
String novoLabel = funcAtual + "_" + label;
// Guarda id na pilha. Espera-se "[n]" em sequida
d = new Descritor(Tipo.VAR_INT,novoLabel,0,nivelEscopo,true);
pilhaSimbolos.push(d);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
case PROG_ACAO_FUNC_RECEBEU_TAM_VETOR:
// Seta o tamanho do vetor no descritor
d = pilhaSimbolos.peek();
d.setNumParam(token.getIComplementaryInformation());
break;
case PROG_ACAO_FUNC_FIM_DECLARACAO_VETOR:
// Recebeu valor do numero de elementos do vetor
// Reserva memoria
d = pilhaSimbolos.pop(); // tira simbolo da pilha
label = d.getLabel();
tam = d.getNumParam();
num = 0; //getProxNumSerieVetor();
buffer.append("\t"+ label + "\tdd\t" + label + "_"+ num + "\n");
buffer.append("\t"+ label + "_"+ num + "\tdd\t");
for(int i=0; i<tam-1; i++){
buffer.append("0,");
}
buffer.append("0\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeVariaveis(buffer.toString());
break;
case PROG_ACAO_FUNC_INI_DECLARACAO_VETOR_BOOL:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(getTokenAnterior());
if(simboloDeclarado(getTokenAnterior(),true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
String novoLabel = funcAtual + "_" + label;
// Guarda id na pilha. Espera-se "[n]" em sequida
d = new Descritor(Tipo.VAR_BOOL,novoLabel,0,nivelEscopo,true);
pilhaSimbolos.push(d);
tabelaSimbolosPut(getInfoComplementar(getTokenAnterior()), d,true);
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(getTokenAnterior()));
}
break;
/*
* Retorno de funcao
*/
case PROG_ACAO_RETURN:
// o resultado da EA vai estar no ACC. Salva resultado em T_FUNC
buffer.append("\tMOV\tT_FUNC,EAX\n");
escreveNoArquivo(buffer.toString());
escreveNoArquivoDeDeclaracaoDeFuncoes(buffer.toString());
break;
/*
* Declaracao de funcao bool
*/
case PROG_ACAO_ID_FUNC_BOOL:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(token);
if(simboloDeclarado(token,true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
d = new Descritor(Tipo.FUNC_BOOL,label,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(token), d,false);
pilhaSimbolos.push(d); // guarda simbolo
}else{
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(token));
}
break;
/*
* Declaracao de funcao void
*/
case PROG_ACAO_ID_FUNC_VOID:
// Na declara��o, precisa ver se o s�mbolo j� existe. Se j� existir � erro, caso contr�rio
// adiciona na tabela de s�mbolos
label = obtemValor(token);
if(simboloDeclarado(token,true)==null){ //OBS: era !simboloExiste(getTokenAnterior(),true)
d = new Descritor(Tipo.FUNC_VOID,label,0,nivelEscopo,false);
tabelaSimbolosPut(getInfoComplementar(token), d,false);
pilhaSimbolos.push(d); // guarda simbolo
}else{
// System.out.println("ja tem: " + label);
throw new RedeclaracaoDeSimboloException("Linha " + sintatico.getLinha() + ": S�mbolo j� foi declarado: " + obtemValor(token));