use of de.be4.classicalb.core.parser.exceptions.VisitorException in project probparsers by bendisposto.
the class ReferencedMachines method determinePackage.
private String[] determinePackage(final TPragmaIdOrString packageTerminal, final Node node) {
String text = packageTerminal.getText();
// "foo.bar" or foo.bar
if ((text.startsWith("\"") && text.endsWith("\""))) {
text = text.replaceAll("\"", "");
}
final String[] packageNameArray = text.split("\\.");
final Pattern VALID_IDENTIFIER = Pattern.compile("([\\p{L}][\\p{L}\\p{N}_]*)");
for (int i = 0; i < packageNameArray.length; i++) {
boolean matches = VALID_IDENTIFIER.matcher(packageNameArray[i]).matches();
if (!matches) {
throw new VisitorException(new CheckException("Invalid package pragma: " + text, node));
}
}
return packageNameArray;
}
use of de.be4.classicalb.core.parser.exceptions.VisitorException in project probparsers by bendisposto.
the class ReferencedMachines method caseAImportPackage.
@Override
public void caseAImportPackage(AImportPackage node) {
final String[] packageArray = determinePackage(node.getPackage(), node);
final File pathFile = getFileStartingAtRootDirectory(packageArray);
final String path = pathFile.getAbsolutePath();
if (pathFile.exists()) {
if (!pathFile.isDirectory()) {
throw new VisitorException(new CheckException(String.format("Imported package is not a directory: %s", path), node));
}
} else {
throw new VisitorException(new CheckException(String.format("Imported package does not exist: %s", path), node));
}
if (this.pathList.contains(path)) {
throw new VisitorException(new CheckException(String.format("Duplicate import statement: %s", node.getPackage().getText()), node));
}
this.pathList.add(path);
}
use of de.be4.classicalb.core.parser.exceptions.VisitorException 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.exceptions.VisitorException in project probparsers by bendisposto.
the class ReferencedMachines method caseAMachineHeader.
@Override
public void caseAMachineHeader(AMachineHeader node) {
machineName = Utils.getTIdentifierListAsString(node.getName());
final String fileNameWithoutExtension = Utils.getFileWithoutExtension(mainFile.getName());
if (isMachineNameMustMatchFileName && !machineName.equals(fileNameWithoutExtension)) {
CheckException ch = new CheckException(String.format("Machine name does not match the file name: '%s' vs '%s'", machineName, fileNameWithoutExtension), node);
throw new VisitorException(ch);
}
}
use of de.be4.classicalb.core.parser.exceptions.VisitorException in project probparsers by bendisposto.
the class ReferencedMachines method caseAMachineReference.
/**
* INCLUDES, EXTENDS, IMPORTS
*/
@Override
public void caseAMachineReference(AMachineReference node) {
String name = getIdentifier(node.getMachineName());
if (node.parent() instanceof AFileMachineReference) {
final AFileMachineReference fileNode = (AFileMachineReference) node.parent();
String file = fileNode.getFile().getText().replaceAll("\"", "");
MachineReference ref;
try {
ref = new MachineReference(name, node, file);
referncesTable.put(name, ref);
} catch (CheckException e) {
throw new VisitorException(e);
}
} else {
MachineReference machineReference = new MachineReference(name, node);
if (this.filePathTable.containsKey(name)) {
machineReference.setDirectoryPath(filePathTable.get(name));
}
referncesTable.put(name, machineReference);
}
}
Aggregations