package Portugol.Language.Analisador;
import static Portugol.Language.Analisador.Simbolo.SimboloIcon;
import Portugol.Language.Calcular.Calculador;
import Portugol.Language.Criar.ExpandDefinirSimbol;
import Portugol.Language.Criar.Intermediario;
import Portugol.Language.Criar.NodeInstruction;
import Portugol.Language.Utilitario.IteratorArray;
import Portugol.Language.Utilitario.IteratorCodeParams;
import Portugol.Language.Utilitario.LanguageException;
import Portugol.Language.Utilitario.Values;
import java.util.Vector;
import javax.swing.Icon;
public class SymbolComposto extends Simbolo {
public static String VERSION = "Versão:2.0 \t(c)Augusto Bilabila e David Silva Barrera";
static public Icon SymbolCompostoIcon;
public Vector<Simbolo> Campos;
TipoRegisto tipoRegistoBase;
public SymbolComposto(String modify, String type, String name, /*String index,*/ Object valor, int level, String origTxt)
throws LanguageException {
TextoOrigen = origTxt;
if (modify.equalsIgnoreCase(Keyword.GetTextKey(Keyword.CONSTANTE))) {
this.isConst = true;
} else {
this.isConst = false;
}
this.type = getType(type);
typeLexema = type;//parametro
this.name = name.trim();
this.value = Values.getDefault(typeLexema);
this.level = level;
tipoRegistoBase = ObterTipoRegisto(type);
CriaCampos();
if (valor != null && valor instanceof SymbolComposto) {
copyFrom((SymbolComposto) valor);
}
}
/**
*
* @param symbolComposto
*/
public SymbolComposto(SymbolComposto symbol) throws LanguageException {
TextoOrigen = symbol.TextoOrigen;
isConst = symbol.isConst;
type = symbol.type;
typeLexema = symbol.typeLexema;//parametro
this.name = symbol.name.trim();
this.level = symbol.level;
tipoRegistoBase = symbol.tipoRegistoBase;
Campos = new Vector<Simbolo>();
for (int i = 0; i < symbol.Campos.size(); i++) {
if (symbol.Campos.get(i) instanceof SymbolArray) {
Campos.add(new SymbolArray((SymbolArray) symbol.Campos.get(i)));
} else if (symbol.Campos.get(i) instanceof SymbolComposto) {
Campos.add(new SymbolComposto((SymbolComposto) symbol.Campos.get(i)));
} else if (symbol.Campos.get(i) instanceof SymbolObjeto) {
Campos.add(new SymbolObjeto((SymbolObjeto) symbol.Campos.get(i)));
} else {
Campos.add(new Simbolo(symbol.Campos.get(i)));
}
}
}
public void copyFrom(SymbolComposto registro) throws LanguageException {
Campos.clear();
for (int i = 0; i < registro.Campos.size(); i++) {
if (registro.Campos.get(i) instanceof SymbolArray) {
Campos.add(new SymbolArray((SymbolArray) registro.Campos.get(i)));
} else if (registro.Campos.get(i) instanceof SymbolComposto) {
Campos.add(new SymbolComposto((SymbolComposto) registro.Campos.get(i)));
} else if (registro.Campos.get(i) instanceof SymbolObjeto) {
Campos.add(new SymbolObjeto((SymbolObjeto) registro.Campos.get(i)));
} else {
Campos.add(new Simbolo(registro.Campos.get(i)));
}
}
}
public void copyFrom(SimboloDeParametro origen) throws LanguageException {
if (origen == null) {
return;
}
// if (origen.PorValor) {
// throw new LanguageException("Tipo de parâmetro não é equivalente ao esperado", "Mude o tipo de parâmetro na chamada");//David:Revisar
// }
if (!typeEqual((Simbolo) origen.Value)) {
throw new LanguageException("Tipo de parâmetro não é equivalente ao esperado", "Mude o tipo de parâmetro na chamada");//David:Revisar
}
SymbolComposto registro = (SymbolComposto) origen.Value;
copyFrom(registro);
}
//-----------------------------------------------------------------------
// public void setValue(String val) throws LanguageException {
// if (this.isConst) {
// throw new LanguageException("O SIMBOLO " + this.name + " É UMA CONSTANTE, POR ISSO, NÃO PODE RECEBER VALOR",
// " ALTERE O SIMBOLO PARA VARIÁVEL, SE FOR O TEU OBJECTIVO");
// }
// this.value = getNormalizedValue(val);
// Campos.set(0, this.value);
// }
// /**
// * retorna o valor
// *
// * @return valor
// */
// @Override
// public Object getValue() {
// return (String) Campos.get(0);
// }
public static TipoRegisto ObterTipoRegisto(String type) throws LanguageException {
for (int i = 0; i < Intermediario.tiposRegistos.size(); i++) {
TipoRegisto tmp = (TipoRegisto) Intermediario.tiposRegistos.get(i);
if (tmp.Name.toUpperCase().equals(type.toUpperCase().trim())) {
return tmp;
}
}
throw new LanguageException(
"O tipo de Registo não foi declarado",
"Declare o tipo de registo"); //David: Revisar ortografia
}
//////////////////////////////////////////////////////////////////////////////
private void CriaCampos() throws LanguageException {
NodeInstruction pt = null;
Campos = new Vector();
for (int i = 0; i < tipoRegistoBase.Defs.size(); i++) {
Simbolo v = (Simbolo) tipoRegistoBase.Defs.get(i);
//String text = v.isConstant() ? "CONSTANTE " : " ") + v.typeLexema + " " + v.getName() + " <- "
// + (v instanceof SymbolComposto ? v.typeLexema : v.getValue());
pt = new NodeInstruction(v.TextoOrigen, 0, 0);
ExpandDefinirSimbol.ExpandVariable(pt, 0, Campos);
}
}
private void CopiarValor() {
}
public String toString() {
return name + " = " + Campos.toString();
}
/**
* nome =
*
* @param var varivel a comparar
* @return nome = paramentro
*/
public boolean typeEqual(Simbolo otro) {
if (otro instanceof SymbolComposto) {
return tipoRegistoBase.Name.equals(((SymbolComposto) otro).tipoRegistoBase.Name);
} else {
return false;
}
}
public Icon getIcon(){
return SymbolCompostoIcon;
}
}