From fdc9b7d760085bdce7bb392386cafe3f3124e05c Mon Sep 17 00:00:00 2001 From: Dave Parker Date: Mon, 22 Dec 2008 15:42:17 +0000 Subject: [PATCH] Improvements to module renaming error reporting. git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@906 bbc10eb1-c90d-0410-af57-cb519fbb1720 --- prism/src/parser/PrismParser.java | 18 +++++++++--------- prism/src/parser/PrismParser.jj | 14 +++++++------- prism/src/parser/ast/Module.java | 12 ++++++++++++ prism/src/parser/ast/ModulesFile.java | 9 ++++++--- prism/src/parser/ast/RenamedModule.java | 24 ++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/prism/src/parser/PrismParser.java b/prism/src/parser/PrismParser.java index af4c33ae..a419203a 100644 --- a/prism/src/parser/PrismParser.java +++ b/prism/src/parser/PrismParser.java @@ -852,14 +852,14 @@ public class PrismParser implements PrismParserConstants { // Module static final public Module Module() throws ParseException { - String name = null; + ExpressionIdent name = null; Declaration var = null; Command comm = null; Module module = null; Token begin = null; begin = jj_consume_token(MODULE); - name = Identifier(); - module = new Module(name); + name = IdentifierExpression(); + module = new Module(name.getName()); label_6: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -887,7 +887,7 @@ public class PrismParser implements PrismParserConstants { module.addCommand(comm); } jj_consume_token(ENDMODULE); - module.setPosition(begin, getToken(0)); {if (true) return module;} + module.setPosition(begin, getToken(0)); module.setNameASTElement(name); {if (true) return module;} throw new Error("Missing return statement in function"); } @@ -1034,14 +1034,14 @@ public class PrismParser implements PrismParserConstants { // Module renaming static final public RenamedModule RenamedModule() throws ParseException { - String name = null, base = null; + ExpressionIdent name = null, base = null; RenamedModule rm = null; Token begin = null; begin = jj_consume_token(MODULE); - name = Identifier(); + name = IdentifierExpression(); jj_consume_token(EQ); - base = Identifier(); - rm = new RenamedModule(name, base); + base = IdentifierExpression(); + rm = new RenamedModule(name.getName(), base.getName()); jj_consume_token(LBRACKET); Rename(rm); label_10: @@ -1059,7 +1059,7 @@ public class PrismParser implements PrismParserConstants { } jj_consume_token(RBRACKET); jj_consume_token(ENDMODULE); - rm.setPosition(begin, getToken(0)); {if (true) return rm;} + rm.setPosition(begin, getToken(0)); rm.setNameASTElement(name); rm.setBaseModuleASTElement(base); {if (true) return rm;} throw new Error("Missing return statement in function"); } diff --git a/prism/src/parser/PrismParser.jj b/prism/src/parser/PrismParser.jj index 7a9a18b7..d6299f83 100644 --- a/prism/src/parser/PrismParser.jj +++ b/prism/src/parser/PrismParser.jj @@ -659,7 +659,7 @@ Declaration Declaration() : Token begin = null; } { - ( { begin = getToken(1);} name = Identifier() + ( { begin = getToken(1); } name = Identifier() // Integer-range variable declaration (( low = Expression(false, false) high = Expression(false, false) ( init = Expression(false, false) )? { decl = new Declaration(name, low, high, init); } ) @@ -672,18 +672,18 @@ Declaration Declaration() : Module Module() : { - String name = null; + ExpressionIdent name = null; Declaration var = null; Command comm = null; Module module = null; Token begin = null; } { - begin = name = Identifier() { module = new Module(name); } + begin = name = IdentifierExpression() { module = new Module(name.getName()); } ( var = Declaration() { module.addDeclaration(var); } )* ( comm = Command() { module.addCommand(comm); } )* - { module.setPosition(begin, getToken(0)); return module; } + { module.setPosition(begin, getToken(0)); module.setNameASTElement(name); return module; } } // Command @@ -755,14 +755,14 @@ void UpdateElement(Update update) : RenamedModule RenamedModule() : { - String name = null, base = null; + ExpressionIdent name = null, base = null; RenamedModule rm = null; Token begin = null; } { - begin = name = Identifier() base = Identifier() { rm = new RenamedModule(name, base); } + begin = name = IdentifierExpression() base = IdentifierExpression() { rm = new RenamedModule(name.getName(), base.getName()); } Rename(rm) ( Rename(rm) )* - { rm.setPosition(begin, getToken(0)); return rm; } + { rm.setPosition(begin, getToken(0)); rm.setNameASTElement(name); rm.setBaseModuleASTElement(base); return rm; } } void Rename(RenamedModule rm) : diff --git a/prism/src/parser/ast/Module.java b/prism/src/parser/ast/Module.java index 4a516e86..1dc84ab1 100644 --- a/prism/src/parser/ast/Module.java +++ b/prism/src/parser/ast/Module.java @@ -36,6 +36,7 @@ public class Module extends ASTElement { // Module name private String name; + private ExpressionIdent nameASTElement; // Local variables private ArrayList decls; // Commands @@ -59,6 +60,11 @@ public class Module extends ASTElement name = n; } + public void setNameASTElement(ExpressionIdent e) + { + nameASTElement = e; + } + public void addDeclaration(Declaration d) { decls.add(d); @@ -93,6 +99,11 @@ public class Module extends ASTElement return name; } + public ExpressionIdent getNameASTElement() + { + return nameASTElement; + } + public int getNumDeclarations() { return decls.size(); @@ -187,6 +198,7 @@ public class Module extends ASTElement { int i, n; Module ret = new Module(name); + ret.setNameASTElement((ExpressionIdent)nameASTElement.deepCopy()); n = getNumDeclarations(); for (i = 0; i < n; i++) { ret.addDeclaration((Declaration)getDeclaration(i).deepCopy()); diff --git a/prism/src/parser/ast/ModulesFile.java b/prism/src/parser/ast/ModulesFile.java index 3cd268ff..56aa462d 100644 --- a/prism/src/parser/ast/ModulesFile.java +++ b/prism/src/parser/ast/ModulesFile.java @@ -401,6 +401,7 @@ public class ModulesFile extends ASTElement { int i, j, n, i2, n2; RenamedModule module; + Module newModule; String s; Object o; @@ -416,7 +417,7 @@ public class ModulesFile extends ASTElement if (j == -1) { s = "No such module " + module.getBaseModule(); s += " in renamed module \"" + module.getName() + "\""; - throw new PrismLangException(s, module); + throw new PrismLangException(s, module.getBaseModuleASTElement()); } // Check for invalid renames n2 = module.getNumRenames(); @@ -427,7 +428,9 @@ public class ModulesFile extends ASTElement } } // Then rename (a copy of) base module and replace - setModule(i, (Module) getModule(j).deepCopy().rename(module)); + newModule = (Module) getModule(j).deepCopy().rename(module); + newModule.setNameASTElement(module.getNameASTElement()); + setModule(i, newModule); } } @@ -473,7 +476,7 @@ public class ModulesFile extends ASTElement s = getModule(i).getName(); for (j = 0; j < i; j++) { if (s.equals(moduleNames[j])) { - throw new PrismLangException("Duplicated module name \"" + s + "\"", getModule(i)); + throw new PrismLangException("Duplicated module name \"" + s + "\"", getModule(i).getNameASTElement()); } } moduleNames[i] = s; diff --git a/prism/src/parser/ast/RenamedModule.java b/prism/src/parser/ast/RenamedModule.java index 3c46d337..50e6af2b 100644 --- a/prism/src/parser/ast/RenamedModule.java +++ b/prism/src/parser/ast/RenamedModule.java @@ -34,7 +34,9 @@ import prism.PrismLangException; public class RenamedModule extends ASTElement { private String name; + private ExpressionIdent nameASTElement; private String baseModule; + private ExpressionIdent baseModuleASTElement; private ArrayList oldNames; private ArrayList newNames; @@ -55,11 +57,21 @@ public class RenamedModule extends ASTElement name = n; } + public void setNameASTElement(ExpressionIdent e) + { + nameASTElement = e; + } + public void setBaseModule(String b) { baseModule = b; } + public void setBaseModuleASTElement(ExpressionIdent e) + { + baseModuleASTElement = e; + } + public void addRename(String s1, String s2) { oldNames.add(s1); @@ -73,11 +85,21 @@ public class RenamedModule extends ASTElement return name; } + public ExpressionIdent getNameASTElement() + { + return nameASTElement; + } + public String getBaseModule() { return baseModule; } + public ExpressionIdent getBaseModuleASTElement() + { + return baseModuleASTElement; + } + public String getNewName(String s) { int i = oldNames.indexOf(s); @@ -146,6 +168,8 @@ public class RenamedModule extends ASTElement { int i, n; RenamedModule ret = new RenamedModule(name, baseModule); + ret.setNameASTElement((ExpressionIdent)nameASTElement.deepCopy()); + ret.setBaseModuleASTElement((ExpressionIdent)baseModuleASTElement.deepCopy()); n = oldNames.size(); for (i = 0; i < n; i++) { ret.addRename(oldNames.get(i), newNames.get(i));