diff --git a/output/ASA_Search.txt b/output/ASA_Search.txt index a3093b8..2cc2863 100644 --- a/output/ASA_Search.txt +++ b/output/ASA_Search.txt @@ -137,7 +137,6 @@ module variableList IDENTIFIER.result SYMBOL.) - block definitionPart definition variableDef diff --git a/src/main/java/analise/semantica/AnaliseSemantica.java b/src/main/java/analise/semantica/AnalisadorSemantico.java similarity index 60% rename from src/main/java/analise/semantica/AnaliseSemantica.java rename to src/main/java/analise/semantica/AnalisadorSemantico.java index 17098b4..1d8af3c 100644 --- a/src/main/java/analise/semantica/AnaliseSemantica.java +++ b/src/main/java/analise/semantica/AnalisadorSemantico.java @@ -6,29 +6,46 @@ import analise.sintatica.ArvoreSintaticaAbstrataNo; import analise.semantica.validacoes.*; -public class AnaliseSemantica { +public class AnalisadorSemantico { + private final ArvoreSintaticaAbstrataNo no; private StringList ListaDeErros; private LinkedList acoes; - public AnaliseSemantica() { + public AnalisadorSemantico(ArvoreSintaticaAbstrataNo no) { this.ListaDeErros = new StringList(); + + this.acoes = new LinkedList(); + this.acoes.add(new AnaliseSemanticaAdicionaTabelaDeSimbolos()); + + this.no = no; + } + + public AnalisadorSemantico() { + this(null); + } + + + public void analisaNo() { + if (this.no != null) + this.analisaNo(this.no); } private void analisaNo(ArvoreSintaticaAbstrataNo no) { - - for (int i = 0; i <= this.acoes.size(); i++) { + for (AnaliseSemanticaAcaoAbstrata acao : this.acoes) { try { - this.acoes.get(i).executa(no); + acao.executa(no); } catch (AnaliseSemanticaException e) { this.ListaDeErros.add(e.getMessage()); } } + + for (ArvoreSintaticaAbstrataNo noFilho : no.getListaDeNos()) { + this.analisaNo(noFilho); + } } private void navegaNaArvore(ArvoreSintaticaAbstrataNo raiz) { - - ArvoreSintaticaAbstrataNo no = raiz; this.analisaNo(no); for (int i = 0; i <= no.quatidadeNosFilhos(); i++ ) { @@ -37,7 +54,6 @@ private void navegaNaArvore(ArvoreSintaticaAbstrataNo raiz) { } public boolean analisarASA(ArvoreSintaticaAbstrataNo raiz) { - this.ListaDeErros.clear(); this.navegaNaArvore(raiz); diff --git a/src/main/java/analise/semantica/validacoes/AnaliseSemanticaAdicionaTabelaDeSimbolos.java b/src/main/java/analise/semantica/validacoes/AnaliseSemanticaAdicionaTabelaDeSimbolos.java index a4f2063..44506bf 100644 --- a/src/main/java/analise/semantica/validacoes/AnaliseSemanticaAdicionaTabelaDeSimbolos.java +++ b/src/main/java/analise/semantica/validacoes/AnaliseSemanticaAdicionaTabelaDeSimbolos.java @@ -1,15 +1,28 @@ package analise.semantica.validacoes; -import analise.TabelaDeSimbolos; import analise.exceptions.AnaliseSemanticaException; import analise.sintatica.ArvoreSintaticaAbstrataNo; +import coretypes.Token; +import coretypes.gcl.GCLTokenTypes; public class AnaliseSemanticaAdicionaTabelaDeSimbolos extends AnaliseSemanticaAcaoAbstrata { - @Override + @Override public void executa(ArvoreSintaticaAbstrataNo no) throws AnaliseSemanticaException { + Token token = no.getToken(); + if (token != null && token.getTokenType().equals(GCLTokenTypes.IDENTIFIER)) { + this.identificaNoPai(no); + } + + } + + private void identificaNoPai(ArvoreSintaticaAbstrataNo no) { + if (no.getNoPai().getNome().equalsIgnoreCase("constantName")) { + + } + /* if (no.getNome().equalsIgnoreCase("constantName")) { ArvoreSintaticaAbstrataNo constante = no.getListaDeNos().get(0); TabelaDeSimbolos.getInstance().add(constante.getToken()); @@ -29,8 +42,7 @@ public void executa(ArvoreSintaticaAbstrataNo no) throws AnaliseSemanticaExcepti if (no.getNome().equalsIgnoreCase("paramDef")) { - } - + } */ } } diff --git a/src/main/java/analise/sintatica/ArvoreSintaticaAbstrataNo.java b/src/main/java/analise/sintatica/ArvoreSintaticaAbstrataNo.java index 5dfa031..daaa601 100644 --- a/src/main/java/analise/sintatica/ArvoreSintaticaAbstrataNo.java +++ b/src/main/java/analise/sintatica/ArvoreSintaticaAbstrataNo.java @@ -13,7 +13,7 @@ public class ArvoreSintaticaAbstrataNo { public ArvoreSintaticaAbstrataNo() { this.listaDeNosFilhos = new LinkedList(); - } + } public ArvoreSintaticaAbstrataNo(String tipoDoNo) { this(); diff --git a/src/test/java/analise/sintatica/AnaliseSintaticaTest.java b/src/test/java/analise/AnaliseTestCase.java similarity index 70% rename from src/test/java/analise/sintatica/AnaliseSintaticaTest.java rename to src/test/java/analise/AnaliseTestCase.java index 20a9646..98ddc24 100644 --- a/src/test/java/analise/sintatica/AnaliseSintaticaTest.java +++ b/src/test/java/analise/AnaliseTestCase.java @@ -1,18 +1,17 @@ -package analise.sintatica; - +package analise; import java.io.IOException; import java.io.InputStream; -import coretypes.gcl.GCLTokenTypes; - - +import junit.framework.TestCase; import utils.Utils; -import analise.sintatica.AnaliseSintatica; import analise.lexica.AnaliseLexica; -import junit.framework.TestCase; +import analise.semantica.AnalisadorSemantico; +import analise.sintatica.AnaliseSintatica; +import analise.sintatica.ArvoreSintaticaAbstrataNo; +import coretypes.gcl.GCLTokenTypes; -public class AnaliseSintaticaTest extends TestCase { +public class AnaliseTestCase extends TestCase { protected AnaliseSintatica analisador; @@ -46,6 +45,17 @@ protected AnaliseLexica buildAnaliseLexica(String codigoFonte){ protected AnaliseSintatica buildAnaliseSintatica(String codigoFonte) { return new AnaliseSintatica( this.buildAnaliseLexica(codigoFonte)); - } + } + + protected AnalisadorSemantico buildAnalisadorSemantico(String codigoFonte) { + ArvoreSintaticaAbstrataNo no; + try { + no = this.buildAnaliseSintatica(codigoFonte).gerarArvore(); + return new AnalisadorSemantico(no); + } catch (Exception e) { + return null; + } + + } } diff --git a/src/test/java/analise/lexica/AnaliseLexicaTest.java b/src/test/java/analise/lexica/AnaliseLexicaTest.java index 04e1cb2..00251da 100644 --- a/src/test/java/analise/lexica/AnaliseLexicaTest.java +++ b/src/test/java/analise/lexica/AnaliseLexicaTest.java @@ -1,11 +1,11 @@ package analise.lexica; +import junit.framework.TestCase; import analise.exceptions.EndOfBufferException; import analise.exceptions.InvalidTokenException; import analise.lexica.AnaliseLexica; import coretypes.Token; import coretypes.gcl.GCLTokenTypes; -import junit.framework.TestCase; public class AnaliseLexicaTest extends TestCase { diff --git a/src/test/java/analise/semantica/AnalisadorSemanticoTest.java b/src/test/java/analise/semantica/AnalisadorSemanticoTest.java new file mode 100644 index 0000000..a3770e3 --- /dev/null +++ b/src/test/java/analise/semantica/AnalisadorSemanticoTest.java @@ -0,0 +1,16 @@ +package analise.semantica; + +import analise.AnaliseTestCase; + +public class AnalisadorSemanticoTest extends AnaliseTestCase { + + public void testAddTSConstantName() { + String codigoFonte = this.loadResourceNamed("semantica/constantName.gcl"); + AnalisadorSemantico analisador = this.buildAnalisadorSemantico(codigoFonte); + analisador.analisaNo(); + + } + + + +} diff --git a/src/test/java/analise/sintatica/AnaliseSintaticaIntegracaoTest.java b/src/test/java/analise/sintatica/AnaliseSintaticaIntegracaoTest.java index 065d59d..55f1091 100644 --- a/src/test/java/analise/sintatica/AnaliseSintaticaIntegracaoTest.java +++ b/src/test/java/analise/sintatica/AnaliseSintaticaIntegracaoTest.java @@ -1,9 +1,10 @@ package analise.sintatica; +import analise.AnaliseTestCase; import analise.exceptions.InvalidTokenException; import analise.exceptions.ProducaoSintaticaException; -public class AnaliseSintaticaIntegracaoTest extends AnaliseSintaticaTest { +public class AnaliseSintaticaIntegracaoTest extends AnaliseTestCase { public void testValidaArquivo_Simples() { String source = this.loadResourceNamed("simples.gcl"); diff --git a/src/test/java/analise/sintatica/AnaliseSintaticaUnitarioTest.java b/src/test/java/analise/sintatica/AnaliseSintaticaUnitarioTest.java index 201d9f0..2ab4c54 100644 --- a/src/test/java/analise/sintatica/AnaliseSintaticaUnitarioTest.java +++ b/src/test/java/analise/sintatica/AnaliseSintaticaUnitarioTest.java @@ -1,10 +1,11 @@ package analise.sintatica; +import analise.AnaliseTestCase; import analise.exceptions.InvalidTokenException; import analise.exceptions.ProducaoSintaticaException; -public class AnaliseSintaticaUnitarioTest extends AnaliseSintaticaTest { +public class AnaliseSintaticaUnitarioTest extends AnaliseTestCase { public void testaModuleBasico(){ diff --git a/src/test/java/analise/sintatica/ArvoreSintaticaAbstrataTest.java b/src/test/java/analise/sintatica/ArvoreSintaticaAbstrataTest.java index a0feebb..bc8f86b 100644 --- a/src/test/java/analise/sintatica/ArvoreSintaticaAbstrataTest.java +++ b/src/test/java/analise/sintatica/ArvoreSintaticaAbstrataTest.java @@ -1,11 +1,12 @@ package analise.sintatica; +import analise.AnaliseTestCase; import analise.exceptions.InvalidTokenException; import analise.exceptions.ProducaoSintaticaException; import coretypes.Token; import coretypes.gcl.GCLTokenTypes; -public class ArvoreSintaticaAbstrataTest extends AnaliseSintaticaTest { +public class ArvoreSintaticaAbstrataTest extends AnaliseTestCase { public void testPrintSimplesPacas() { diff --git a/src/test/resources/asa_simples.txt b/src/test/resources/asa_simples.txt deleted file mode 100644 index a72f8d4..0000000 --- a/src/test/resources/asa_simples.txt +++ /dev/null @@ -1,7 +0,0 @@ -module - keyword.module - identifier.simples - block - keyword.begin - keyword.end - symbol.. diff --git a/src/test/resources/semantica/ASA_Search.txt b/src/test/resources/semantica/ASA_Search.txt new file mode 100644 index 0000000..a3093b8 --- /dev/null +++ b/src/test/resources/semantica/ASA_Search.txt @@ -0,0 +1,541 @@ +module + KEYWORD.module + IDENTIFIER.search + KEYWORD.private + block + definitionPart + definition + constantDef + KEYWORD.const + constantName + IDENTIFIER.size + SYMBOL.= + constant + expression + relationalExpression + simpleExpression + term + factor + NUMBER.10 + SYMBOL.; + definition + typeDef + KEYWORD.typedef + type + typeSymbol + KEYWORD.integer + rangeType + KEYWORD.range + SYMBOL.[ + constant + expression + relationalExpression + simpleExpression + term + factor + NUMBER.1 + KEYWORD.to + constant + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.size + SYMBOL.] + IDENTIFIER.sizer + SYMBOL.; + definition + typeDef + KEYWORD.typedef + type + typeSymbol + KEYWORD.integer + arrayType + KEYWORD.array + SYMBOL.[ + IDENTIFIER.sizer + SYMBOL.] + IDENTIFIER.elements + SYMBOL.; + definition + variableDef + type + typeSymbol + IDENTIFIER.sizer + variableList + IDENTIFIER.j + SYMBOL.; + definition + variableDef + type + typeSymbol + IDENTIFIER.elements + variableList + IDENTIFIER.A + SYMBOL.; + definition + variableDef + type + typeSymbol + KEYWORD.integer + variableList + IDENTIFIER.x + SYMBOL.; + definition + variableDef + type + tupleType + SYMBOL.[ + typeSymbol + KEYWORD.Boolean + SYMBOL., + typeSymbol + KEYWORD.integer + SYMBOL.] + variableList + IDENTIFIER.result + SYMBOL.; + definition + procedureDef + procedureDecl + KEYWORD.proc + IDENTIFIER.search + paramPart + SYMBOL.( + paramDef + KEYWORD.val + variableDef + type + typeSymbol + KEYWORD.integer + variableList + IDENTIFIER.target + SYMBOL.; + paramDef + KEYWORD.val + variableDef + type + typeSymbol + IDENTIFIER.elements + variableList + IDENTIFIER.B + SYMBOL.; + paramDef + KEYWORD.ref + variableDef + type + tupleType + SYMBOL.[ + typeSymbol + KEYWORD.Boolean + SYMBOL., + typeSymbol + KEYWORD.integer + SYMBOL.] + variableList + IDENTIFIER.result + SYMBOL.) + block + definitionPart + definition + variableDef + type + typeSymbol + KEYWORD.integer + variableList + IDENTIFIER.m + SYMBOL.; + definition + variableDef + type + typeSymbol + KEYWORD.integer + variableList + IDENTIFIER.i + SYMBOL.; + definition + variableDef + type + typeSymbol + KEYWORD.Boolean + variableList + IDENTIFIER.found + SYMBOL.; + definition + variableDef + type + typeSymbol + KEYWORD.integer + variableList + IDENTIFIER.where + SYMBOL.; + KEYWORD.begin + statementPart + statement + assignStatement + variableAccessList + variableAccess + IDENTIFIER.i + SYMBOL.:= + expressionList + expression + relationalExpression + simpleExpression + term + factor + NUMBER.1 + SYMBOL.; + statement + assignStatement + variableAccessList + variableAccess + IDENTIFIER.m + SYMBOL.:= + expressionList + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.size + SYMBOL.; + statement + assignStatement + variableAccessList + variableAccess + IDENTIFIER.found + SYMBOL.:= + expressionList + expression + relationalExpression + simpleExpression + term + factor + booleanConstant + KEYWORD.false + SYMBOL.; + statement + doStatement + KEYWORD.do + guardedCommandList + guardedCommand + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.i + relationalOperator + SYMBOL.<= + simpleExpression + term + factor + variableAccess + IDENTIFIER.m + SYMBOL.-> + statementPart + statement + ifStatement + KEYWORD.if + guardedCommandList + guardedCommand + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.B + relationalOperator + SYMBOL.= + simpleExpression + term + factor + variableAccess + IDENTIFIER.target + SYMBOL.-> + statementPart + statement + assignStatement + variableAccessList + variableAccess + IDENTIFIER.found + SYMBOL.:= + expressionList + expression + relationalExpression + simpleExpression + term + factor + booleanConstant + KEYWORD.true + SYMBOL.; + statement + assignStatement + variableAccessList + variableAccess + IDENTIFIER.where + SYMBOL.:= + expressionList + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.i + SYMBOL.; + statement + assignStatement + variableAccessList + variableAccess + IDENTIFIER.i + SYMBOL.:= + expressionList + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.m + addingOperator + SYMBOL.+ + term + factor + NUMBER.1 + SYMBOL.; + SYMBOL.[] + guardedCommand + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.B + relationalOperator + SYMBOL.# + simpleExpression + term + factor + variableAccess + IDENTIFIER.target + SYMBOL.-> + statementPart + statement + assignStatement + variableAccessList + variableAccess + IDENTIFIER.i + SYMBOL.:= + expressionList + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.i + addingOperator + SYMBOL.+ + term + factor + NUMBER.1 + SYMBOL.; + KEYWORD.fi + SYMBOL.; + KEYWORD.od + SYMBOL.; + statement + assignStatement + variableAccessList + variableAccess + IDENTIFIER.result + SYMBOL.:= + expressionList + expression + relationalExpression + simpleExpression + term + factor + SYMBOL.[ + expressionList + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.found + SYMBOL., + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.where + SYMBOL.] + SYMBOL.; + KEYWORD.end + SYMBOL.; + KEYWORD.begin + statementPart + statement + forStatement + KEYWORD.forall + variableAccess + IDENTIFIER.j + SYMBOL.-> + statementPart + statement + readStatement + KEYWORD.read + variableAccessList + variableAccess + IDENTIFIER.A + SYMBOL.; + KEYWORD.llarof + SYMBOL.; + statement + readStatement + KEYWORD.read + variableAccessList + variableAccess + IDENTIFIER.x + SYMBOL.; + statement + doStatement + KEYWORD.do + guardedCommandList + guardedCommand + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.x + relationalOperator + SYMBOL.# + simpleExpression + term + factor + NUMBER.0 + SYMBOL.-> + statementPart + statement + callStatement + IDENTIFIER.search + argumentList + SYMBOL.( + expressionList + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.x + SYMBOL., + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.A + SYMBOL., + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.result + SYMBOL.) + SYMBOL.; + statement + ifStatement + KEYWORD.if + guardedCommandList + guardedCommand + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.result + SYMBOL.-> + statementPart + statement + writeStatement + KEYWORD.write + writeItem + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.x + SYMBOL., + writeItem + LITERAL.' can be found at ' + SYMBOL., + writeItem + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.result + SYMBOL.; + SYMBOL.[] + guardedCommand + expression + relationalExpression + simpleExpression + term + factor + SYMBOL.~ + factor + variableAccess + IDENTIFIER.result + SYMBOL.-> + statementPart + statement + writeStatement + KEYWORD.write + writeItem + expression + relationalExpression + simpleExpression + term + factor + variableAccess + IDENTIFIER.x + SYMBOL., + writeItem + LITERAL.' not found' + SYMBOL.; + KEYWORD.fi + SYMBOL.; + statement + readStatement + KEYWORD.read + variableAccessList + variableAccess + IDENTIFIER.x + SYMBOL.; + KEYWORD.od + SYMBOL.; + KEYWORD.end + SYMBOL.. diff --git a/src/test/resources/asa_simplesPacas.txt b/src/test/resources/semantica/asa_simplesPacas.txt similarity index 100% rename from src/test/resources/asa_simplesPacas.txt rename to src/test/resources/semantica/asa_simplesPacas.txt diff --git a/src/test/resources/semantica/constantName.gcl b/src/test/resources/semantica/constantName.gcl new file mode 100644 index 0000000..a1db166 --- /dev/null +++ b/src/test/resources/semantica/constantName.gcl @@ -0,0 +1,6 @@ +module search +private + const size = 10; +begin + -- test search +end. \ No newline at end of file