diff --git a/pom.xml b/pom.xml
index 91bc6806c6e313d325f45e05c5af6e42cb2c698e..bd3ed0d32d377ee7247140b6651b84f6d04e6c87 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
de.monticore.lang.monticar
embedded-montiarc-math-generator
- 0.0.16-SNAPSHOT
+ 0.0.17-SNAPSHOT
diff --git a/src/main/java/de/monticore/lang/monticar/generator/cpp/converter/StringIndexHelper.java b/src/main/java/de/monticore/lang/monticar/generator/cpp/converter/StringIndexHelper.java
index 677638b85f56a9e9f458f80ecf71b7b2bb363f44..0f96d07afe5450859ad591d36e62b76823729769 100644
--- a/src/main/java/de/monticore/lang/monticar/generator/cpp/converter/StringIndexHelper.java
+++ b/src/main/java/de/monticore/lang/monticar/generator/cpp/converter/StringIndexHelper.java
@@ -2,28 +2,36 @@ package de.monticore.lang.monticar.generator.cpp.converter;
/**
* @author Sascha Schneiders
+ * @author Christoph Richter
*/
public class StringIndexHelper {
public static String modifyContentBetweenBracketsByAdding(String input, String modifier) {
+ return modifyContentBetweenBracketsByAdding(input, modifier, "(", ",", ")");
+ }
+
+ /**
+ * Only adds modifier in the first occurring bracket
+ */
+ public static String modifyContentBetweenBracketsByAdding(String input, String modifier, String bracketStart, String bracketSep, String bracketEnd) {
String result = "";
boolean done = false;
- int indexFirst = input.indexOf("(", 0);
+ int indexFirst = input.indexOf(bracketStart, 0);
if (indexFirst == -1)
return input;
result += input.substring(0, indexFirst);
- int indexSecond = input.indexOf(",", indexFirst + 1);
+ int indexSecond = input.indexOf(bracketSep, indexFirst + bracketSep.length());
if (indexSecond == -1) {
- indexSecond = input.indexOf(")", indexFirst + 1);
+ indexSecond = input.indexOf(bracketEnd, indexFirst + bracketEnd.length());
done = true;
}
while (!done) {
result += input.substring(indexFirst, indexSecond) + modifier;
indexFirst = indexSecond;
- indexSecond = input.indexOf(",", indexSecond + 1);
+ indexSecond = input.indexOf(bracketSep, indexSecond + bracketSep.length());
if (indexSecond == -1) {
- indexSecond = input.indexOf(")", indexFirst + 1);
+ indexSecond = input.indexOf(bracketEnd, indexFirst + bracketEnd.length());
done = true;
}
}
@@ -37,9 +45,22 @@ public class StringIndexHelper {
if (input.endsWith(endPart)) {
int indexFirst = input.lastIndexOf(endPart);
result = input.substring(0, indexFirst);
- result+=newEndPart;
+ result += newEndPart;
}
return result;
}
+ public static String modifyContentBetweenBracketsByAddingForAllBrackets(String input, String modifier, String bracketStart, String bracketSep, String bracketEnd) {
+ String[] parts = input.split("(?<=\\))");
+ StringBuilder sb = new StringBuilder();
+ for (String s : parts) {
+ sb.append(modifyContentBetweenBracketsByAdding(s, modifier, bracketStart, bracketSep, bracketEnd));
+ }
+ return sb.toString();
+ }
+
+ public static String modifyContentBetweenBracketsByAddingForAllBrackets(String input, String modifier) {
+ return modifyContentBetweenBracketsByAddingForAllBrackets(input, modifier, "(", ",", ")");
+ }
+
}
diff --git a/src/main/java/de/monticore/lang/monticar/generator/optimization/MathInformationRegister.java b/src/main/java/de/monticore/lang/monticar/generator/optimization/MathInformationRegister.java
index c8693c0c1c87fda9b4d1d1872eafd694b803265c..e762f49f4fbf422e960a72645d4223964471889d 100644
--- a/src/main/java/de/monticore/lang/monticar/generator/optimization/MathInformationRegister.java
+++ b/src/main/java/de/monticore/lang/monticar/generator/optimization/MathInformationRegister.java
@@ -1,10 +1,8 @@
package de.monticore.lang.monticar.generator.optimization;
-import de.monticore.lang.math._symboltable.expression.MathExpressionSymbol;
-import de.monticore.lang.math._symboltable.expression.MathNumberExpressionSymbol;
-import de.monticore.lang.math._symboltable.expression.MathValueExpressionSymbol;
-import de.monticore.lang.math._symboltable.expression.MathValueSymbol;
+import de.monticore.lang.math._symboltable.expression.*;
import de.monticore.lang.math._symboltable.matrix.MathMatrixAccessOperatorSymbol;
+import de.monticore.lang.math._symboltable.matrix.MathMatrixNameExpressionSymbol;
import de.monticore.lang.monticar.generator.BluePrint;
import de.monticore.lang.monticar.generator.Variable;
import de.monticore.lang.monticar.generator.cpp.BluePrintCPP;
@@ -19,6 +17,7 @@ import java.util.Optional;
* This class stores information of already encountered math information
*
* @author Sascha Schneiders
+ * @author Christoph Richter
*/
public class MathInformationRegister {
protected List variables = new ArrayList<>();//contains in implementation Math section declared Variables
@@ -164,6 +163,7 @@ public class MathInformationRegister {
var.addDimensionalInformation(dimension.getTextualRepresentation());
this.variables.add(var);
var.addProperties(mathValueSymbol.getType().getProperties());
+ this.mathValueSymbols.add(mathValueSymbol);
}
public Variable getVariable(String name) {
@@ -200,4 +200,74 @@ public class MathInformationRegister {
}
return result;
}
+
+ /**
+ * Searches MathValueSymbol in list and returns first matching symbol which contains the type declaration information
+ *
+ * @param symbol Symbol for which type information should be collected
+ * @return returns the first type declaration as symbol
+ */
+ public MathValueSymbol getFullTypeInformation(MathValueSymbol symbol) {
+ MathValueSymbol result = getMathValueSymbol(symbol.getName());
+ if (result == null)
+ result = symbol;
+ return result;
+ }
+
+ /**
+ * Variables are replaced by their definition.
+ *
+ * @param nonAtomarExpression Expression in which the variables will be substituted
+ * @param atomarValueName Defines the name of the atomar variable after which no more substitution will be made
+ * @return MathExpressionSymbol containing the replaces variables
+ */
+ public MathExpressionSymbol resolveMathExpressionToAtomarExpression(MathExpressionSymbol nonAtomarExpression, String atomarValueName) {
+ MathExpressionSymbol result;
+ if (nonAtomarExpression.isArithmeticExpression()) {
+ // recursively substitute expressions
+ MathArithmeticExpressionSymbol arithmeticSubstituted = (MathArithmeticExpressionSymbol) nonAtomarExpression;
+ MathArithmeticExpressionSymbol arithmeticResult = new MathArithmeticExpressionSymbol();
+ arithmeticResult.setMathOperator(arithmeticSubstituted.getOperator());
+ arithmeticResult.setLeftExpression(resolveMathExpressionToAtomarExpression(arithmeticSubstituted.getLeftExpression(), atomarValueName));
+ arithmeticResult.setRightExpression(resolveMathExpressionToAtomarExpression(arithmeticSubstituted.getRightExpression(), atomarValueName));
+ result = arithmeticResult;
+ } else if (nonAtomarExpression instanceof MathValueSymbol) {
+ // substitute value expr by assigned expr
+ MathValueSymbol valueExpr = (MathValueSymbol) nonAtomarExpression;
+ result = getSubstituteByName(valueExpr.getName(), nonAtomarExpression, atomarValueName);
+ } else if (nonAtomarExpression instanceof MathMatrixNameExpressionSymbol) {
+ MathMatrixNameExpressionSymbol sourceExpr = (MathMatrixNameExpressionSymbol) nonAtomarExpression;
+ MathMatrixNameExpressionSymbol targetExpr;
+ // modifiy access name
+ String accessName = getSubstituteByName(sourceExpr.getNameToAccess(), nonAtomarExpression, atomarValueName).getTextualRepresentation();
+ if (sourceExpr.isMathMatrixAccessOperatorSymbolPresent() && !(accessName.contains("("))) {
+ targetExpr = new MathMatrixNameExpressionSymbol(String.format("(%s)", accessName));
+ // modify access operator
+ MathMatrixAccessOperatorSymbol sourceAccessOperator = sourceExpr.getMathMatrixAccessOperatorSymbol();
+ MathMatrixAccessOperatorSymbol targetAccessOperator = new MathMatrixAccessOperatorSymbol();
+ targetAccessOperator.setMathMatrixAccessSymbols(sourceAccessOperator.getMathMatrixAccessSymbols());
+ targetAccessOperator.setAccessStartSymbol(".at(");
+ targetExpr.setMathMatrixAccessOperatorSymbol(targetAccessOperator);
+ result = targetExpr;
+ } else {
+ result = nonAtomarExpression;
+ }
+ } else if (nonAtomarExpression instanceof IMathNamedExpression) {
+ // substitute value expr by assigned expr
+ result = getSubstituteByName(((IMathNamedExpression) nonAtomarExpression).getNameToAccess(), nonAtomarExpression, atomarValueName);
+ } else {
+ result = nonAtomarExpression;
+ }
+ return result;
+ }
+
+ private MathExpressionSymbol getSubstituteByName(String name, MathExpressionSymbol expr, String atomarValueName) {
+ MathExpressionSymbol result;
+ MathValueSymbol declaration = getMathValueSymbol(name);
+ if ((declaration != null) && (declaration.getValue() != null) && (!name.contentEquals(atomarValueName)))
+ result = declaration.getValue();
+ else
+ result = expr;
+ return result;
+ }
}