public static FEEL_1_1Parser parse(FEELEventListenersManager eventsManager, String source, Map<String, Type> inputVariableTypes, Map<String, Object> inputVariables, Collection<FEELFunction> additionalFunctions, List<FEELProfile> profiles) { ANTLRInputStream input = new ANTLRInputStream(source); FEEL_1_1Lexer lexer = new FEEL_1_1Lexer( input ); CommonTokenStream tokens = new CommonTokenStream( lexer ); FEEL_1_1Parser parser = new FEEL_1_1Parser( tokens ); ParserHelper parserHelper = new ParserHelper(eventsManager); additionalFunctions.forEach(f -> parserHelper.getSymbolTable().getBuiltInScope().define(f.getSymbol())); profiles.stream().filter(FEELv12Profile.class::isInstance).forEach(dc -> { parserHelper.setFeatDMN12EnhancedForLoopEnabled(true); parserHelper.setFeatDMN12weekday(true); }); parser.setHelper(parserHelper); parser.setErrorHandler( new FEELErrorHandler() ); parser.removeErrorListeners(); // removes the error listener that prints to the console parser.addErrorListener( new FEELParserErrorListener( eventsManager ) ); // pre-loads the parser with symbols defineVariables( inputVariableTypes, inputVariables, parser ); return parser; }
private static void defineVariables(Map<String, Type> inputVariableTypes, Map<String, Object> inputVariables, FEEL_1_1Parser parser) { inputVariableTypes.forEach( (name, type) -> { parser.getHelper().defineVariable( name, type ); if (type.getName() != null) { parser.getHelper().getSymbolTable().getGlobalScope().define(new BuiltInTypeSymbol(type.getName(), type)); } } ); inputVariables.forEach( (name, value) -> { parser.getHelper().defineVariable( name ); if( value instanceof Map ) { try { parser.getHelper().pushName( name ); parser.getHelper().pushScope(); defineVariables( Collections.EMPTY_MAP, (Map<String, Object>) value, parser ); } finally { parser.getHelper().popScope(); parser.getHelper().popName(); } } } ); }