Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch 'master' of git://github.com/SAnjos/cgcl

  • Loading branch information...
commit 253adb902e93a0170fe0a007192ad873c0b64218 2 parents 5872a3f + bbe310f
@fabricionoda fabricionoda authored
View
2  src/main/java/analise/semantica/validacoes/AnaliseSemanticaVerificaProcedures.java
@@ -33,7 +33,7 @@ public void executa(ArvoreSintaticaAbstrataNo no) throws AnaliseSemanticaExcepti
contadorDeParametros ++;
}
- if (((SimboloFuncao) proc).getParametros().size() == contadorDeParametros)
+ if (((SimboloFuncao) proc).getParametros().size() != contadorDeParametros)
throw new AnaliseSemanticaException("Quantidade de parametros inválidos para o procedimento: " + procIdentifier.getValue());
}
}
View
36 src/main/java/codigoIntermediario/CodigoIntermediario.java
@@ -0,0 +1,36 @@
+package codigoIntermediario;
+
+import java.util.LinkedList;
+
+public class CodigoIntermediario {
+
+ private static CodigoIntermediario instancia = new CodigoIntermediario();
+ private LinkedList<ConstrucaoDeQuatroEnderecos> pilha;
+
+ private CodigoIntermediario() {
+ this.pilha = new LinkedList<ConstrucaoDeQuatroEnderecos>();
+ }
+
+ public static CodigoIntermediario getInstancia() {
+ return instancia;
+ }
+
+ public static void add(String operador, String elementoEsquerda, String elementoDireita) {
+ String resultado = "";
+ CodigoIntermediario.add(operador, elementoEsquerda, elementoDireita, resultado);
+ }
+
+ public static void add(String operador, String elementoEsquerda, String elementoDireita, String resultado) {
+ ConstrucaoDeQuatroEnderecos linha = new ConstrucaoDeQuatroEnderecos();
+ linha.setOperador(operador);
+ linha.setElementoAEsquerda(elementoEsquerda);
+ linha.setElementoADireita(elementoDireita);
+ linha.setResultado(resultado);
+ CodigoIntermediario.add(linha);
+ }
+
+ public static void add(ConstrucaoDeQuatroEnderecos linha) {
+ instancia.pilha.add(linha);
+ }
+
+}
View
42 src/main/java/codigoIntermediario/ConstrucaoDeQuatroEnderecos.java
@@ -0,0 +1,42 @@
+package codigoIntermediario;
+
+public class ConstrucaoDeQuatroEnderecos {
+
+ private String resultado;
+ private String elementoAEsquerda;
+ private String elementoADireita;
+ private String operador;
+
+ public String getResultado() {
+ return resultado;
+ }
+
+ public void setResultado(String resultado) {
+ this.resultado = resultado;
+ }
+
+ public String getElementoAEsquerda() {
+ return elementoAEsquerda;
+ }
+
+ public void setElementoAEsquerda(String elementoAEsquerda) {
+ this.elementoAEsquerda = elementoAEsquerda;
+ }
+
+ public String getElementoADireita() {
+ return elementoADireita;
+ }
+
+ public void setElementoADireita(String elementoADireita) {
+ this.elementoADireita = elementoADireita;
+ }
+
+ public String getOperador() {
+ return operador;
+ }
+
+ public void setOperador(String operador) {
+ this.operador = operador;
+ }
+
+}
View
46 src/main/java/codigoIntermediario/GeradorDeCodigoIntermediario.java
@@ -0,0 +1,46 @@
+package codigoIntermediario;
+
+import java.util.LinkedList;
+
+import codigoIntermediario.construcoesIntermediarias.ConstrucaoIntermediaria;
+import codigoIntermediario.construcoesIntermediarias.ConstrucaoIntermediariaAtribuicao;
+
+import analise.sintatica.ArvoreSintaticaAbstrataNo;
+
+public class GeradorDeCodigoIntermediario {
+
+ private LinkedList<ConstrucaoIntermediaria> construcoes;
+
+ public GeradorDeCodigoIntermediario() {
+ super();
+ this.construcoes = new LinkedList<ConstrucaoIntermediaria>();
+ }
+
+ private void processaNo(ArvoreSintaticaAbstrataNo no) {
+
+ if (no.getNome().equalsIgnoreCase("assignStatement")) {
+ ConstrucaoIntermediariaAtribuicao.getInstancia().traduz(no);
+ }
+
+ if (no.getNome().equalsIgnoreCase("ifStatement")) {
+ }
+
+ if (no.getNome().equalsIgnoreCase("writeStatement")) {
+ }
+
+ }
+
+ private void percorreAvoreSintatica(ArvoreSintaticaAbstrataNo noInicial) {
+
+ this.processaNo(noInicial);
+
+ for (ArvoreSintaticaAbstrataNo no : noInicial.getListaDeNos())
+ this.percorreAvoreSintatica(no);
+ }
+
+ public String traduz(ArvoreSintaticaAbstrataNo noRaiz) {
+ this.percorreAvoreSintatica(noRaiz);
+ return "";
+ }
+
+}
View
15 src/main/java/codigoIntermediario/VariaveisTemporarias.java
@@ -0,0 +1,15 @@
+package codigoIntermediario;
+
+public class VariaveisTemporarias {
+
+ private static VariaveisTemporarias instance;
+
+ private VariaveisTemporarias() {
+ instance = new VariaveisTemporarias();
+ }
+
+ public static VariaveisTemporarias getInstancia() {
+ return instance;
+ }
+
+}
View
9 src/main/java/codigoIntermediario/construcoesIntermediarias/ConstrucaoIntermediaria.java
@@ -0,0 +1,9 @@
+package codigoIntermediario.construcoesIntermediarias;
+
+import analise.sintatica.ArvoreSintaticaAbstrataNo;
+
+public abstract class ConstrucaoIntermediaria {
+
+ public abstract void traduz(ArvoreSintaticaAbstrataNo no);
+
+}
View
50 ...java/codigoIntermediario/construcoesIntermediarias/ConstrucaoIntermediariaAtribuicao.java
@@ -0,0 +1,50 @@
+package codigoIntermediario.construcoesIntermediarias;
+
+import coretypes.Token;
+import coretypes.gcl.GCLTokenTypes;
+import analise.sintatica.ArvoreSintaticaAbstrataNo;
+
+public class ConstrucaoIntermediariaAtribuicao extends ConstrucaoIntermediaria {
+
+ private static ConstrucaoIntermediariaAtribuicao instancia;
+ private ConstrucaoIntermediariaAtribuicao() {
+ super();
+ instancia = new ConstrucaoIntermediariaAtribuicao();
+ }
+
+ public static ConstrucaoIntermediariaAtribuicao getInstancia() {
+ return instancia;
+ }
+
+ private void extraiVariaveisDeVariableAccessList(ArvoreSintaticaAbstrataNo variableAccessList) {
+
+ for (ArvoreSintaticaAbstrataNo no : variableAccessList.getListaDeNos()) {
+ if (no.getNome().equalsIgnoreCase("variableAccess")) {
+ Token id = no.getListaDeNos().getFirst().getToken();
+ if (id != null && id.getTokenType() == GCLTokenTypes.IDENTIFIER) {
+ id.getValue();
+ // TODO: Verificar como estruturar as variaveis para retorno
+ }
+ }
+ }
+ }
+
+ private void processaExpressionList(ArvoreSintaticaAbstrataNo expressionList) {
+
+ for (ArvoreSintaticaAbstrataNo expression : expressionList.getListaDeNos()) {
+
+ if (expression.getNome().equalsIgnoreCase("expression")) {
+ ConstrucaoIntermediariaExpression.getInstancia().traduz(expression);
+ }
+
+ }
+ }
+
+ @Override
+ public void traduz(ArvoreSintaticaAbstrataNo no) {
+ this.extraiVariaveisDeVariableAccessList(no.getListaDeNos().getFirst());
+ this.processaExpressionList(no.getListaDeNos().getLast());
+ }
+
+
+}
View
97 ...java/codigoIntermediario/construcoesIntermediarias/ConstrucaoIntermediariaExpression.java
@@ -0,0 +1,97 @@
+package codigoIntermediario.construcoesIntermediarias;
+
+import codigoIntermediario.CodigoIntermediario;
+import analise.sintatica.ArvoreSintaticaAbstrataNo;
+import coretypes.Token;
+
+public class ConstrucaoIntermediariaExpression extends ConstrucaoIntermediaria {
+
+ private static ConstrucaoIntermediariaExpression instancia;
+
+ private ConstrucaoIntermediariaExpression() {
+ super();
+ instancia = new ConstrucaoIntermediariaExpression();
+ }
+
+ public static ConstrucaoIntermediariaExpression getInstancia() {
+ return instancia;
+ }
+
+ private String processaFactor(ArvoreSintaticaAbstrataNo factor) {
+
+ ArvoreSintaticaAbstrataNo primeiroFilho = factor.getListaDeNos().getFirst();
+
+ if (primeiroFilho.getNome().equalsIgnoreCase("NUMBER")) {
+ Token numero = primeiroFilho.getToken();
+ if (numero != null)
+ return numero.getValue();
+ }
+
+ if (primeiroFilho.getNome().equalsIgnoreCase("variableAccess")) {
+ Token id = primeiroFilho.getListaDeNos().getFirst().getToken();
+ if (id != null)
+ return id.getValue();
+ }
+
+ return "";
+ }
+
+ private boolean factorEhMultiplicacao(ArvoreSintaticaAbstrataNo factor) {
+ return factor.getListaDeNos().size() > 1;
+ }
+
+ private String extraiValorDeUmTerm(ArvoreSintaticaAbstrataNo term) {
+
+ if (factorEhMultiplicacao(term)) {
+ // gerar um temp
+ // processar a multiplicacao
+ return "";
+ } else {
+ return this.processaFactor(term.getListaDeNos().getFirst());
+ }
+ }
+
+ private String processaSimpleExpression(ArvoreSintaticaAbstrataNo simpleExpression) {
+
+ if (simpleExpression.getListaDeNos().size() != 3) return;
+
+ String term1 = this.extraiValorDeUmTerm(simpleExpression.getListaDeNos().get(0));
+ String operador = "+";
+ String term2 = this.extraiValorDeUmTerm(simpleExpression.getListaDeNos().get(2));
+
+ CodigoIntermediario.add(operador, term1, term2, resultado);
+
+ }
+
+ private void processaRelationalOperator(ArvoreSintaticaAbstrataNo relationalOperator) {
+ // TODO: verificar o q deve ser feito com esse operador
+ }
+
+ private void processaRelationalExpression(ArvoreSintaticaAbstrataNo relationalExpression) {
+
+ for (ArvoreSintaticaAbstrataNo no : relationalExpression.getListaDeNos()) {
+ if (no.getNome().equalsIgnoreCase("simpleExpression"))
+ this.processaSimpleExpression(no);
+
+ if (no.getNome().equalsIgnoreCase("relationalOperator"))
+ this.processaRelationalOperator(no);
+ }
+ }
+
+ @Override
+ public void traduz(ArvoreSintaticaAbstrataNo expression) {
+
+ for (ArvoreSintaticaAbstrataNo no : expression.getListaDeNos()) {
+
+ if (no.getNome().equalsIgnoreCase("relationalExpression")) {
+ this.processaRelationalExpression(no);
+ }
+
+ if (no.getNome().equalsIgnoreCase("booleanOperator")) {
+ //
+ }
+ }
+
+ }
+
+}
View
1  src/test/java/analise/semantica/AnalisadorSemanticoTest.java
@@ -106,6 +106,7 @@ public void testFalhaChamadaDeProcedureComParametrosErrados() {
analisador.analisar();
assertEquals(1, analisador.getListaDeErros().size());
+ assertEquals("Quantidade de parametros inválidos para o procedimento: minhaProcedure", analisador.getListaDeErros().getFirst());
}
}

0 comments on commit 253adb9

Please sign in to comment.
Something went wrong with that request. Please try again.