blob: d72f5446e9eb79a129cba00c7c805b8bb50ec947 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sysml.parser.pydml;
import java.util.HashSet;
import java.util.Set;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.sysml.parser.common.CustomErrorListener;
import org.apache.sysml.parser.pydml.PydmlParser.AddSubExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.AssignmentStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.AtomicExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.BooleanAndExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.BooleanNotExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.BooleanOrExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.BuiltinFunctionExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.CommandlineParamExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.CommandlinePositionExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ConstDoubleIdExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ConstFalseExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ConstIntIdExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ConstStringIdExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ConstTrueExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.DataIdExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ElifBranchContext;
import org.apache.sysml.parser.pydml.PydmlParser.ExternalFunctionDefExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ForStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.FunctionCallAssignmentStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.FunctionCallMultiAssignmentStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.IfStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.IfdefAssignmentStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.IgnoreNewLineContext;
import org.apache.sysml.parser.pydml.PydmlParser.ImportStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.IndexedExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.InternalFunctionDefExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.IterablePredicateColonExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.IterablePredicateSeqExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.MatrixDataTypeCheckContext;
import org.apache.sysml.parser.pydml.PydmlParser.Ml_typeContext;
import org.apache.sysml.parser.pydml.PydmlParser.ModIntDivExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.MultDivExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ParForStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.ParameterizedExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.PathStatementContext;
import org.apache.sysml.parser.pydml.PydmlParser.PowerExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ProgramrootContext;
import org.apache.sysml.parser.pydml.PydmlParser.RelationalExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.SimpleDataIdentifierExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.StrictParameterizedExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.StrictParameterizedKeyValueStringContext;
import org.apache.sysml.parser.pydml.PydmlParser.TypedArgNoAssignContext;
import org.apache.sysml.parser.pydml.PydmlParser.UnaryExpressionContext;
import org.apache.sysml.parser.pydml.PydmlParser.ValueDataTypeCheckContext;
import org.apache.sysml.parser.pydml.PydmlParser.WhileStatementContext;
/**
* Minimal pre-processing of user function definitions which take precedence over built-in
* functions in cases where names conflict. This pre-processing takes place outside of
* PymlSyntacticValidator since the function definition can be located after the function
* is used in a statement.
*/
public class PydmlPreprocessor implements PydmlListener {
protected final CustomErrorListener errorListener;
// Names of user internal and external functions definitions
protected Set<String> functions;
public PydmlPreprocessor(CustomErrorListener errorListener) {
this.errorListener = errorListener;
functions = new HashSet<String>();
}
public Set<String> getFunctionDefs() {
return functions;
}
@Override
public void enterExternalFunctionDefExpression(ExternalFunctionDefExpressionContext ctx) {
validateFunctionName(ctx.name.getText(), ctx);
}
@Override
public void exitExternalFunctionDefExpression(ExternalFunctionDefExpressionContext ctx) {}
@Override
public void enterInternalFunctionDefExpression(InternalFunctionDefExpressionContext ctx) {
validateFunctionName(ctx.name.getText(), ctx);
}
@Override
public void exitInternalFunctionDefExpression(InternalFunctionDefExpressionContext ctx) {}
protected void validateFunctionName(String name, ParserRuleContext ctx) {
if (!functions.contains(name)) {
functions.add(name);
}
else {
notifyErrorListeners("Function Name Conflict: '" + name + "' already defined in " + errorListener.getCurrentFileName(), ctx.start);
}
}
protected void notifyErrorListeners(String message, Token op) {
errorListener.validationError(op.getLine(), op.getCharPositionInLine(), message);
}
// -----------------------------------------------------------------
// Not overridden
// -----------------------------------------------------------------
@Override
public void visitTerminal(TerminalNode node) {}
@Override
public void visitErrorNode(ErrorNode node) {}
@Override
public void enterEveryRule(ParserRuleContext ctx) {}
@Override
public void exitEveryRule(ParserRuleContext ctx) {}
@Override
public void enterFunctionCallMultiAssignmentStatement(FunctionCallMultiAssignmentStatementContext ctx) {}
@Override
public void exitFunctionCallMultiAssignmentStatement(FunctionCallMultiAssignmentStatementContext ctx) {}
@Override
public void enterIgnoreNewLine(IgnoreNewLineContext ctx) {}
@Override
public void exitIgnoreNewLine(IgnoreNewLineContext ctx) {}
@Override
public void enterMatrixDataTypeCheck(MatrixDataTypeCheckContext ctx) {}
@Override
public void exitMatrixDataTypeCheck(MatrixDataTypeCheckContext ctx) {}
@Override
public void enterStrictParameterizedKeyValueString(StrictParameterizedKeyValueStringContext ctx) {}
@Override
public void exitStrictParameterizedKeyValueString(StrictParameterizedKeyValueStringContext ctx) {}
@Override
public void enterPathStatement(PathStatementContext ctx) {}
@Override
public void exitPathStatement(PathStatementContext ctx) {}
@Override
public void enterConstTrueExpression(ConstTrueExpressionContext ctx) {}
@Override
public void exitConstTrueExpression(ConstTrueExpressionContext ctx) {}
@Override
public void enterTypedArgNoAssign(TypedArgNoAssignContext ctx) {}
@Override
public void exitTypedArgNoAssign(TypedArgNoAssignContext ctx) {}
@Override
public void enterWhileStatement(WhileStatementContext ctx) {}
@Override
public void exitWhileStatement(WhileStatementContext ctx) {}
@Override
public void enterConstStringIdExpression(ConstStringIdExpressionContext ctx) {}
@Override
public void exitConstStringIdExpression(ConstStringIdExpressionContext ctx) {}
@Override
public void enterDataIdExpression(DataIdExpressionContext ctx) {}
@Override
public void exitDataIdExpression(DataIdExpressionContext ctx) {}
@Override
public void enterAtomicExpression(AtomicExpressionContext ctx) {}
@Override
public void exitAtomicExpression(AtomicExpressionContext ctx) {}
@Override
public void enterPowerExpression(PowerExpressionContext ctx) {}
@Override
public void exitPowerExpression(PowerExpressionContext ctx) {}
@Override
public void enterFunctionCallAssignmentStatement(FunctionCallAssignmentStatementContext ctx) {}
@Override
public void exitFunctionCallAssignmentStatement(FunctionCallAssignmentStatementContext ctx) {}
@Override
public void enterModIntDivExpression(ModIntDivExpressionContext ctx) {}
@Override
public void exitModIntDivExpression(ModIntDivExpressionContext ctx) {}
@Override
public void enterSimpleDataIdentifierExpression(SimpleDataIdentifierExpressionContext ctx) {}
@Override
public void exitSimpleDataIdentifierExpression(SimpleDataIdentifierExpressionContext ctx) {}
@Override
public void enterBuiltinFunctionExpression(BuiltinFunctionExpressionContext ctx) {}
@Override
public void exitBuiltinFunctionExpression(BuiltinFunctionExpressionContext ctx) {}
@Override
public void enterConstIntIdExpression(ConstIntIdExpressionContext ctx) {}
@Override
public void exitConstIntIdExpression(ConstIntIdExpressionContext ctx) {}
@Override
public void enterForStatement(ForStatementContext ctx) {}
@Override
public void exitForStatement(ForStatementContext ctx) {}
@Override
public void enterParameterizedExpression(ParameterizedExpressionContext ctx) {}
@Override
public void exitParameterizedExpression(ParameterizedExpressionContext ctx) {}
@Override
public void enterConstFalseExpression(ConstFalseExpressionContext ctx) {}
@Override
public void exitConstFalseExpression(ConstFalseExpressionContext ctx) {}
@Override
public void enterBooleanOrExpression(BooleanOrExpressionContext ctx) {}
@Override
public void exitBooleanOrExpression(BooleanOrExpressionContext ctx) {}
@Override
public void enterAssignmentStatement(AssignmentStatementContext ctx) {}
@Override
public void exitAssignmentStatement(AssignmentStatementContext ctx) {}
@Override
public void enterIterablePredicateColonExpression(IterablePredicateColonExpressionContext ctx) {}
@Override
public void exitIterablePredicateColonExpression(IterablePredicateColonExpressionContext ctx) {}
@Override
public void enterParForStatement(ParForStatementContext ctx) {}
@Override
public void exitParForStatement(ParForStatementContext ctx) {}
@Override
public void enterStrictParameterizedExpression(StrictParameterizedExpressionContext ctx) {}
@Override
public void exitStrictParameterizedExpression(StrictParameterizedExpressionContext ctx) {}
@Override
public void enterCommandlineParamExpression(CommandlineParamExpressionContext ctx) {}
@Override
public void exitCommandlineParamExpression(CommandlineParamExpressionContext ctx) {}
@Override
public void enterMultDivExpression(MultDivExpressionContext ctx) {}
@Override
public void exitMultDivExpression(MultDivExpressionContext ctx) {}
@Override
public void enterAddSubExpression(AddSubExpressionContext ctx) {}
@Override
public void exitAddSubExpression(AddSubExpressionContext ctx) {}
@Override
public void enterImportStatement(ImportStatementContext ctx) {}
@Override
public void exitImportStatement(ImportStatementContext ctx) {}
@Override
public void enterProgramroot(ProgramrootContext ctx) {}
@Override
public void exitProgramroot(ProgramrootContext ctx) {}
@Override
public void enterIterablePredicateSeqExpression(IterablePredicateSeqExpressionContext ctx) {}
@Override
public void exitIterablePredicateSeqExpression(IterablePredicateSeqExpressionContext ctx) {}
@Override
public void enterIfdefAssignmentStatement(IfdefAssignmentStatementContext ctx) {}
@Override
public void exitIfdefAssignmentStatement(IfdefAssignmentStatementContext ctx) {}
@Override
public void enterBooleanAndExpression(BooleanAndExpressionContext ctx) {}
@Override
public void exitBooleanAndExpression(BooleanAndExpressionContext ctx) {}
@Override
public void enterIndexedExpression(IndexedExpressionContext ctx) {}
@Override
public void exitIndexedExpression(IndexedExpressionContext ctx) {}
@Override
public void enterBooleanNotExpression(BooleanNotExpressionContext ctx) {}
@Override
public void exitBooleanNotExpression(BooleanNotExpressionContext ctx) {}
@Override
public void enterIfStatement(IfStatementContext ctx) {}
@Override
public void exitIfStatement(IfStatementContext ctx) {}
@Override
public void enterRelationalExpression(RelationalExpressionContext ctx) {}
@Override
public void exitRelationalExpression(RelationalExpressionContext ctx) {}
@Override
public void enterCommandlinePositionExpression(CommandlinePositionExpressionContext ctx) {}
@Override
public void exitCommandlinePositionExpression(CommandlinePositionExpressionContext ctx) {}
@Override
public void enterConstDoubleIdExpression(ConstDoubleIdExpressionContext ctx) {}
@Override
public void exitConstDoubleIdExpression(ConstDoubleIdExpressionContext ctx) {}
@Override
public void enterUnaryExpression(UnaryExpressionContext ctx) {}
@Override
public void exitUnaryExpression(UnaryExpressionContext ctx) {}
@Override
public void enterValueDataTypeCheck(ValueDataTypeCheckContext ctx) {}
@Override
public void exitValueDataTypeCheck(ValueDataTypeCheckContext ctx) {}
@Override
public void enterMl_type(Ml_typeContext ctx) {}
@Override
public void exitMl_type(Ml_typeContext ctx) {}
@Override
public void enterElifBranch(ElifBranchContext ctx) {}
@Override
public void exitElifBranch(ElifBranchContext ctx) {}
}