diff --git a/src/main/java/avatartranslator/AvatarError.java b/src/main/java/avatartranslator/AvatarError.java index c4cc8d85a5457d5c36868d6333227da4e74b8853..ab7c09fd124575c00199d68c43cf4a8f5208f177 100644 --- a/src/main/java/avatartranslator/AvatarError.java +++ b/src/main/java/avatartranslator/AvatarError.java @@ -69,7 +69,12 @@ public class AvatarError { "Invalid attribute in action on signal", "Invalid type in signal definition", "Invalid int expression in action on signal", - /*20*/"Invalid bool expression in action on signal" + /*20*/"Invalid bool expression in action on signal", + "Invalid number of parameters in action", + "Invalid integer value in method call", + "Invalid boolean value in method call", + "Invalid expression in method call", + /*25*/"Invalid type in method call" }; diff --git a/src/main/java/avatartranslator/AvatarSyntaxChecker.java b/src/main/java/avatartranslator/AvatarSyntaxChecker.java index 08840066197609d42c0c65b804c23c5376806b34..71530c87ae695f081969b4666ec200fb83f06eb3 100644 --- a/src/main/java/avatartranslator/AvatarSyntaxChecker.java +++ b/src/main/java/avatartranslator/AvatarSyntaxChecker.java @@ -529,13 +529,93 @@ public class AvatarSyntaxChecker { if (asm != null) { for (AvatarStateMachineElement asme : asm.getListOfElements()) { if (asme instanceof AvatarTransition) { - + for(AvatarAction aa: ((AvatarTransition)(asme)).getActions()) { + AvatarError ae = checkAction(avspec, block, ((AvatarTransition)(asme)), aa); + if (ae != null) + errors.add( ae ); + } } } } } return errors; } + public static AvatarError checkAction(AvatarSpecification avspec, AvatarBlock block, AvatarTransition asme, AvatarAction aa) { + if (aa instanceof AvatarTermFunction) { + AvatarTermFunction atf = (AvatarTermFunction) aa; + + int size = atf.getMethod().getListOfAttributes().size(); + + if (size != atf.getArgs().components.size()) { + AvatarError error = new AvatarError(avspec); + error.block = block; + error.firstAvatarElement = atf; + error.error = 21; + return error; + } + + for(int i=0; i<size; i++) { + // Check that each value correspond to the expected type + AvatarAttribute param = atf.getMethod().getListOfAttributes().get(i); + AvatarTerm term = atf.getArgs().components.get(i); + + + if (term instanceof AvatarAttribute) { + if ( ((AvatarAttribute)term).getType() != param.getType()) { + AvatarError error = new AvatarError(avspec); + error.block = block; + error.firstAvatarElement = asme; + error.error = 25; + return error; + } + } else { + String value = term.toString(); + TraceManager.addDev("Value:>" + value + "< of class>" + term.getClass().toString() + "<"); + if (param.getType() == AvatarType.INTEGER) { + TraceManager.addDev("Trying to parse int expr: " + value); + AvatarIBSExpressions.IExpr e1 = AvatarIBSolver.parseInt(block, value); + if (e1 == null) { + TraceManager.addDev("Parse error in int expr: " + value); + AvatarError error = new AvatarError(avspec); + error.block = block; + error.firstAvatarElement = asme; + error.error = 22; + return error; + } + TraceManager.addDev("Parse ok in int expr: " + value); + } else if (param.getType() == AvatarType.BOOLEAN) { + IBSExpressions.BExpr e1 = AvatarIBSolver.parseBool(block, value); + if (e1 == null) { + AvatarError error = new AvatarError(avspec); + error.block = block; + error.firstAvatarElement = asme; + error.error = 23; + return error; + } + } else { + AvatarError error = new AvatarError(avspec); + error.block = block; + error.firstAvatarElement = asme; + error.error = 18; + return error; + } + } + + + + + } + } + + // We assume that this is a variable setting, possibly with a method call + + + + + return null; + + } + public static int isAValidGuard(AvatarSpecification _as, AvatarStateMachineOwner _ab, String _guard) { diff --git a/src/main/java/avatartranslator/AvatarTransition.java b/src/main/java/avatartranslator/AvatarTransition.java index 0d8c3f612a648e2cdda245a4096584cef5688e40..c1bc9b4aeec0eb367d209730ca0ee2cc32e26d96 100644 --- a/src/main/java/avatartranslator/AvatarTransition.java +++ b/src/main/java/avatartranslator/AvatarTransition.java @@ -102,7 +102,7 @@ public class AvatarTransition extends AvatarStateMachineElement { public AvatarTransition(AvatarStateMachineOwner _block, String _name, Object _referenceObject) { super(_name, _referenceObject, _block); - actions = new LinkedList<AvatarAction>(); + actions = new LinkedList<>(); this.guard = new AvatarGuardEmpty(); this.block = _block; guardSolver = null; diff --git a/ttool/src/test/java/avatartranslator/AvatarIBSStdParserTest.java b/ttool/src/test/java/avatartranslator/AvatarIBSStdParserTest.java index a3edd47ab6c03d297a90dc3bf38a93530c962e01..2afac7aac6d2187d3c2f8e9899de2ca31325db5d 100644 --- a/ttool/src/test/java/avatartranslator/AvatarIBSStdParserTest.java +++ b/ttool/src/test/java/avatartranslator/AvatarIBSStdParserTest.java @@ -81,6 +81,9 @@ public class AvatarIBSStdParserTest { block1.addAttribute(a1); AvatarAttribute b1 = new AvatarAttribute("key2", AvatarType.BOOLEAN, block1, null); block1.addAttribute(b1); + + AvatarAttribute t = new AvatarAttribute("t", AvatarType.TIMER, block1, null); + block1.addAttribute(t); x1.setInitialValue("10"); y1.setInitialValue("5"); @@ -277,6 +280,9 @@ public class AvatarIBSStdParserTest { //assertTrue(e15!=null); //TraceManager.addDev("Testing e15 done"); + AvatarIBSExpressions.IExpr e16 = AvatarIBSolver.parseInt(block1,"t+3"); + assertTrue(e16!=null); + assertTrue(e1.eval(specBlock) == 15); assertTrue(e2.eval(specBlock)); diff --git a/ttool/src/test/java/avatartranslator/AvatarIntegerExprParsingAndEvaluationTests.java b/ttool/src/test/java/avatartranslator/AvatarIntegerExprParsingAndEvaluationTests.java index d94a42b4e3c9601fb2ae2ea4efac769b7f4dcf23..c9e7f0f81f8c1e21356793fb6f2ffea02f5c1b29 100644 --- a/ttool/src/test/java/avatartranslator/AvatarIntegerExprParsingAndEvaluationTests.java +++ b/ttool/src/test/java/avatartranslator/AvatarIntegerExprParsingAndEvaluationTests.java @@ -142,6 +142,7 @@ public class AvatarIntegerExprParsingAndEvaluationTests { testExpr("x = x*((x + y)*z + (x+z)/z)/x", 36, true); + }