use of de.be4.classicalb.core.parser.node.TDefLiteralSubstitution in project probparsers by bendisposto.
the class OpSubstitutions method caseAFuncOpSubstitution.
@Override
public void caseAFuncOpSubstitution(final AFuncOpSubstitution node) {
final PExpression expression = node.getFunction();
PExpression idExpr = null;
LinkedList<PExpression> parameters = null;
Type type = null;
TIdentifierLiteral idToken = null;
String idString = null;
if (expression instanceof AFunctionExpression) {
// the operation was parsed as a function expression
final AFunctionExpression function = (AFunctionExpression) expression;
final PExpression funcId = function.getIdentifier();
if (funcId instanceof AIdentifierExpression) {
final AIdentifierExpression identifier = (AIdentifierExpression) funcId;
idString = Utils.getTIdentifierListAsString(identifier.getIdentifier());
idToken = identifier.getIdentifier().get(0);
type = definitions.getType(idString);
} else {
type = Type.NoDefinition;
}
idExpr = function.getIdentifier();
parameters = new LinkedList<>(function.getParameters());
} else if (expression instanceof AIdentifierExpression) {
// the operation was parsed as an identifier expression
final AIdentifierExpression identifier = (AIdentifierExpression) expression;
idString = Utils.getTIdentifierListAsString(identifier.getIdentifier());
idToken = identifier.getIdentifier().get(0);
type = definitions.getType(idString);
idExpr = expression;
parameters = new LinkedList<>();
} else {
// some other expression was parsed (NOT allowed)
throw new BParseException(null, "Expecting operation");
}
if (type != Type.NoDefinition && idToken != null) {
if (type == Type.Substitution || type == Type.ExprOrSubst) {
// create DefinitionSubstitution
final ADefinitionSubstitution defSubst = new ADefinitionSubstitution(new TDefLiteralSubstitution(idToken.getText(), idToken.getLine(), idToken.getPos()), parameters);
if (type == Type.ExprOrSubst) {
// type is determined now => set to Substitution
setTypeSubstDef(node, idString);
}
// transfer position information
final PositionedNode posNode = node;
final PositionedNode newPosNode = defSubst;
newPosNode.setStartPos(posNode.getStartPos());
newPosNode.setEndPos(posNode.getEndPos());
node.replaceBy(defSubst);
defSubst.apply(this);
} else {
// finding some other type here is an error!
throw new VisitorException(new CheckException("Expecting substitution here but found definition with type '" + type + "'", node));
}
} else {
// no def, no problem ;-)
final AOpSubstitution opSubst = new AOpSubstitution(idExpr, parameters);
opSubst.setStartPos(idExpr.getStartPos());
opSubst.setEndPos(idExpr.getEndPos());
node.replaceBy(opSubst);
opSubst.apply(this);
}
}
use of de.be4.classicalb.core.parser.node.TDefLiteralSubstitution in project probparsers by bendisposto.
the class ASTBuilder method addPrintSubDefinitionToIdefinitions.
public static void addPrintSubDefinitionToIdefinitions(IDefinitions definitions) {
if (definitions.containsDefinition(PRINT)) {
return;
}
/*-
* PRINT(x) == skip;
* EXTERNAL_SUBSTITUTION_PRINT(T) == T; /* declare as external for any type T
*/
ASubstitutionDefinitionDefinition printDef = new ASubstitutionDefinitionDefinition();
printDef.setName(new TDefLiteralSubstitution(PRINT));
printDef.setParameters(createIdentifierList("value"));
printDef.setRhs(new ASkipSubstitution());
definitions.addDefinition(printDef, IDefinitions.Type.Substitution);
AExpressionDefinitionDefinition forceDefType = new AExpressionDefinitionDefinition();
forceDefType.setName(new TIdentifierLiteral("EXTERNAL_SUBSTITUTION_" + PRINT));
forceDefType.setParameters(createIdentifierList("T"));
forceDefType.setRhs(createIdentifier("T"));
definitions.addDefinition(forceDefType, IDefinitions.Type.Expression);
}
use of de.be4.classicalb.core.parser.node.TDefLiteralSubstitution in project probparsers by bendisposto.
the class OpSubstitutions method setTypeSubstDef.
private void setTypeSubstDef(final AFuncOpSubstitution node, final String idString) {
final AExpressionDefinitionDefinition oldDefinition = (AExpressionDefinitionDefinition) definitions.getDefinition(idString);
final Node defRhs = oldDefinition.getRhs();
final PSubstitution rhsSubst;
if (defRhs instanceof AFunctionExpression) {
final AFunctionExpression rhsFunction = (AFunctionExpression) defRhs;
rhsSubst = new AOpSubstitution(rhsFunction.getIdentifier(), new LinkedList<PExpression>(rhsFunction.getParameters()));
rhsSubst.setStartPos(rhsFunction.getStartPos());
rhsSubst.setEndPos(rhsFunction.getEndPos());
} else if (defRhs instanceof AIdentifierExpression) {
final AIdentifierExpression rhsIdent = (AIdentifierExpression) defRhs;
rhsSubst = new AOpSubstitution(rhsIdent, new LinkedList<PExpression>());
rhsSubst.setStartPos(rhsIdent.getStartPos());
rhsSubst.setEndPos(rhsIdent.getEndPos());
} else {
// some other expression was parsed (NOT allowed)
throw new VisitorException(new CheckException("Expecting operation", node));
}
final TIdentifierLiteral oldDefId = oldDefinition.getName();
final TDefLiteralSubstitution defId = new TDefLiteralSubstitution(oldDefId.getText(), oldDefId.getLine(), oldDefId.getPos());
final ASubstitutionDefinitionDefinition substDef = new ASubstitutionDefinitionDefinition(defId, new LinkedList<PExpression>(oldDefinition.getParameters()), rhsSubst);
substDef.setStartPos(oldDefinition.getStartPos());
substDef.setEndPos(oldDefinition.getEndPos());
definitions.replaceDefinition(idString, Type.Substitution, substDef);
oldDefinition.replaceBy(substDef);
}
Aggregations