Permalink
Browse files

Implementados conceitos básicos de OO

  • Loading branch information...
1 parent b32b882 commit 42e815d7940394ab5cd8d86d5c334a8858f8b89d @tarruda tarruda committed May 8, 2012
@@ -46,6 +46,16 @@ FUNCAO
:
'funcao'
;
+
+CONSTRUIR
+ :
+ 'novo'|'nova'
+ ;
+
+CLASSE
+ :
+ 'classe'
+ ;
RETORNAR
:
@@ -67,6 +67,7 @@ comando_bloco returns [Comando rv]
:
(
cmd=declaracao_de_funcao
+ | cmd=declaracao_de_classe
| cmd=se
| cmd=enquanto
| cmd=para
@@ -119,6 +120,12 @@ ArrayList<String> parametros = new ArrayList<String>();
}
;
+declaracao_de_classe returns [Comando rv]
+ :
+ CLASSE nome=identificador EPAR s=identificador DPAR objeto
+ {$rv = new DeclaracaoDeClasse($nome.rv, $s.rv, $objeto.rv);}
+ ;
+
se returns [Comando rv]
@init {
Se se = null;
@@ -424,10 +431,14 @@ atomo returns [Expressao rv]
// o antlr nao aceita isso
:
(
- (objeto
- {
- $rv = $objeto.rv;
- })
+ (construcao
+ {
+ $rv = $construcao.rv;
+ })
+ | (objeto
+ {
+ $rv = $objeto.rv;
+ })
| (lista
{
$rv = $lista.rv;
@@ -451,6 +462,24 @@ atomo returns [Expressao rv]
)
;
+construcao returns [Expressao rv]
+@init {
+ArrayList<Expressao> args = new ArrayList<Expressao>();
+}
+ :
+ CONSTRUIR s=identificador EPAR (a1=expressao
+ {
+ args.add($a1.rv);
+ }
+ (VIRG an=expressao
+ {
+ args.add($an.rv);
+ })*)? DPAR
+ {
+ $rv = new Construcao($s.rv, args);
+ }
+ ;
+
objeto returns [Expressao rv]
@init {
Objeto o = new Objeto();
@@ -565,12 +594,14 @@ valor returns [Expressao rv]
identificador returns [Identificador rv]
@init {
- int nivelEscopo = 0;
+int nivelEscopo = 0;
}
:
(
- (ESCOPO {nivelEscopo++;})*
- t=IDENTIFICADOR
+ (ESCOPO
+ {
+ nivelEscopo++;
+ })* t=IDENTIFICADOR
| t=A
)
@@ -0,0 +1,32 @@
+package br.cin.ufpe.ast;
+
+import java.util.List;
+
+import br.cin.ufpe.runtime.Acesso;
+import br.cin.ufpe.runtime.Escopo;
+import br.cin.ufpe.runtime.Objeto;
+
+public class Construcao extends Expressao {
+
+ private Expressao superClasse;
+ private List<Expressao> initArgs;
+
+ public Construcao(Expressao superClasse, List<Expressao> initArgs) {
+ this.superClasse = superClasse;
+ this.initArgs = initArgs;
+ }
+
+ @Override
+ public Object valor(Escopo escopo) {
+ br.cin.ufpe.runtime.Objeto rv = new Objeto();
+ Object superClasse = this.superClasse.valor(escopo);
+ rv.put(Acesso.SUPER, superClasse);
+ Object[] args = new Object[initArgs.size() + 1];
+ args[0] = rv;
+ for (int i = 1; i < args.length; i++)
+ args[i] = initArgs.get(i - 1).valor(escopo);
+ Acesso.chamarMetodo(Acesso.INIT, args);
+ return rv;
+ }
+
+}
@@ -0,0 +1,29 @@
+package br.cin.ufpe.ast;
+
+import br.cin.ufpe.ast.Retornar.Retorno;
+import br.cin.ufpe.runtime.Acesso;
+import br.cin.ufpe.runtime.Escopo;
+
+public class DeclaracaoDeClasse extends Comando {
+
+ private Identificador nome;
+ private Identificador sup;
+ private Expressao obj;
+
+ public DeclaracaoDeClasse(Identificador nome, Identificador sup,
+ Expressao obj) {
+ this.nome = nome;
+ this.sup = sup;
+ this.obj = obj;
+ }
+
+ @Override
+ protected void executarCmd(Escopo escopo) throws Retorno {
+ Object superClasse = sup.valor(escopo);
+ br.cin.ufpe.runtime.Objeto obj = (br.cin.ufpe.runtime.Objeto) this.obj
+ .valor(escopo);
+ obj.put(Acesso.SUPER, superClasse);
+ escopo.put(nome.getNome(), obj);
+ }
+
+}
@@ -9,8 +9,10 @@
public class Acesso {
- public static final String GETTER = "*getAtributo";
- public static final String SETTER = "*setAtributo";
+ public static final String GETTER = "[getAtributo]";
+ public static final String SETTER = "[setAtributo]";
+ public static final String SUPER = "[super]";
+ public static final String INIT = "[init]";
public static Object chamarMetodo(String nome, Object... argumentos) {
Object alvo = argumentos[0];
@@ -29,31 +31,34 @@ private static Object chamarMetodo(Funcao f, Object... argumentos) {
}
public static Object getAtributoReal(Object alvo, Object arg) {
- Objeto classe = getClasse(alvo);
+ Object cls = null;
+ if (alvo.getClass() == Objeto.class)
+ cls = alvo;
+ else
+ cls = getSuper(alvo);
Object rv = null;
- Object cls = classe;
while (rv == null && cls instanceof Objeto) {
- Objeto c = (Objeto) cls;
+ Objeto c = (Objeto) cls;
rv = c.get(arg);
- cls = ((Objeto) cls).get("classe");
+ cls = getSuper(cls);
}
return rv;
}
- public static Objeto getClasse(Object alvo) {
- Objeto classe = null;
+ public static Object getSuper(Object alvo) {
+ Object rv = null;
if (alvo instanceof Boolean)
- classe = ClasseBoolean.instancia;
+ rv = ClasseBoolean.instancia;
else if (alvo instanceof Long)
- classe = ClasseLong.instancia;
+ rv = ClasseLong.instancia;
else if (alvo instanceof Double)
- classe = ClasseDouble.instancia;
+ rv = ClasseDouble.instancia;
else if (alvo instanceof String)
- classe = ClasseString.instancia;
+ rv = ClasseString.instancia;
else if (alvo instanceof Objeto)
- classe = (Objeto) alvo;
+ rv = (Objeto) ((Objeto) alvo).get(SUPER);
else
throw new IllegalArgumentException("Tipo de objeto desconhecido");
- return classe;
+ return rv;
}
}
@@ -2,6 +2,7 @@
import java.util.HashMap;
+import br.cin.ufpe.runtime.classes.ClasseEmbutida;
import br.cin.ufpe.runtime.funcoes.FuncaoEmbutida;
@SuppressWarnings("serial")
@@ -16,11 +17,15 @@ public Escopo() {
public Escopo(Escopo superEscopo) {
this.superEscopo = superEscopo;
}
-
+
public Escopo getSuperEscopo() {
return superEscopo;
}
+ public void embutirClasse(ClasseEmbutida cls) {
+ this.put(cls.getNome(), cls);
+ }
+
public void embutirFuncao(FuncaoEmbutida func) {
this.put(func.getNome(), func);
}
@@ -7,6 +7,6 @@
@SuppressWarnings("serial")
public class Objeto extends HashMap<Object, Object> {
public Objeto() {
- put("classe", ClasseObjeto.instancia);
+ put(Acesso.SUPER, ClasseObjeto.instancia);
}
}
@@ -12,7 +12,7 @@
public static final ClasseBoolean instancia = new ClasseBoolean();
private ClasseBoolean() {
- put("classe", ClasseObjeto.instancia);
+ put(Acesso.SUPER, ClasseObjeto.instancia);
put("texto", new Funcao() {
@Override
public Object chamar(List<Object> args) {
@@ -77,6 +77,6 @@ public Object chamar(List<Object> args) {
@Override
public String getNome() {
- return "String";
+ return "Booleano";
}
}
@@ -1,13 +1,15 @@
package br.cin.ufpe.runtime.classes;
+import br.cin.ufpe.runtime.Acesso;
+
@SuppressWarnings("serial")
public class ClasseDouble extends ClasseEmbutida {
public static final ClasseDouble instancia = new ClasseDouble();
private ClasseDouble() {
- put("classe", ClasseNumber.instancia);
+ put(Acesso.SUPER, ClasseNumber.instancia);
}
@@ -2,6 +2,7 @@
import br.cin.ufpe.runtime.Objeto;
+
@SuppressWarnings("serial")
public abstract class ClasseEmbutida extends Objeto {
public abstract String getNome();
@@ -2,6 +2,7 @@
import java.util.List;
+import br.cin.ufpe.runtime.Acesso;
import br.cin.ufpe.runtime.Funcao;
import br.cin.ufpe.runtime.Operacao;
@@ -11,7 +12,7 @@
public static final ClasseLong instancia = new ClasseLong();
private ClasseLong() {
- put("classe", ClasseNumber.instancia);
+ put(Acesso.SUPER, ClasseNumber.instancia);
put("#&#", new Funcao() {
@Override
public Object chamar(List<Object> args) {
@@ -60,7 +61,7 @@ public Object chamar(List<Object> args) {
@Override
public String getNome() {
- return "Long";
+ return "Inteiro";
}
}
@@ -12,7 +12,7 @@
public static final ClasseNumber instancia = new ClasseNumber();
private ClasseNumber() {
- put("classe", ClasseObjeto.instancia);
+ put(Acesso.SUPER, ClasseObjeto.instancia);
put("comparar", new Funcao() {
@Override
public Object chamar(List<Object> args) {
@@ -116,7 +116,7 @@ public Object chamar(List<Object> args) {
@Override
public String getNome() {
- return "Number";
+ return "Numero";
}
}
@@ -25,13 +25,16 @@ public Object chamar(List<Object> args) {
checarNumeroDeArgs(args, 2);
Object alvo = args.get(0);
Object attr = args.get(1);
- Objeto classe = Acesso.getClasse(alvo);
+ Object cls = null;
+ if (alvo.getClass() == Objeto.class)
+ cls = alvo;
+ else
+ cls = Acesso.getSuper(alvo);
Object rv = null;
- Object cls = classe;
while (rv == null && cls instanceof Objeto) {
Objeto c = (Objeto) cls;
rv = c.get(attr);
- cls = ((Objeto) cls).get("classe");
+ cls = Acesso.getSuper(cls);
}
return rv;
}
@@ -125,6 +128,6 @@ public Object chamar(List<Object> args) {
@Override
public String getNome() {
- return "Object";
+ return "Objeto";
}
}
@@ -12,7 +12,7 @@
public static final ClasseString instancia = new ClasseString();
private ClasseString() {
- put("classe", ClasseObjeto.instancia);
+ put(Acesso.SUPER, ClasseObjeto.instancia);
put("comparar", new Funcao() {
@Override
public Object chamar(List<Object> args) {
@@ -4,6 +4,7 @@
import java.io.OutputStream;
import br.cin.ufpe.runtime.Escopo;
+import br.cin.ufpe.runtime.classes.ClasseObjeto;
public class Util {
@@ -16,4 +17,8 @@ public static void embutirFuncoes(Escopo escopo, InputStream entradaPadrao,
public static void embutirFuncoes(Escopo escopo) {
embutirFuncoes(escopo, System.in, System.out, System.err);
}
+
+ public static void embutirClasses(Escopo escopo) {
+ escopo.embutirClasse(ClasseObjeto.instancia);
+ }
}
Oops, something went wrong.

0 comments on commit 42e815d

Please sign in to comment.