| /* |
| * 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) {} |
| |
| } |