public static FEEL_1_1Parser parse(FEELEventListenersManager eventsManager, String source, Map<String, Type> inputVariableTypes, Map<String, Object> inputVariables, Collection<FEELFunction> additionalFunctions, List<FEELProfile> profiles, FEELTypeRegistry typeRegistry) {
        CharStream input = CharStreams.fromString(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()));
        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 );
        
        if (typeRegistry != null) {
            parserHelper.setTypeRegistry(typeRegistry);
        }

        return parser;
    }
@Disabled("dropped since DMNv1.2")
    @Test
    void functionDecisionTableInvocation() {
        String inputExpression = "decision table( "
                                 + "    outputs: \"Applicant Risk Rating\","
                                 + "    input expression list: [\"Applicant Age\", \"Medical History\"],"
                                 + "    rule list: ["
                                 + "        [ >60      , \"good\" , \"Medium\" ],"
                                 + "        [ >60      , \"bad\"  , \"High\"   ],"
                                 + "        [ [25..60] , -        , \"Medium\" ]," // also another problem is the - operator cannot be inside of expression.
                                 + "        [ <25      , \"good\" , \"Low\"    ],"
                                 + "        [ <25      , \"bad\"  , \"Medium\" ] ],"
                                 + "    hit policy: \"Unique\" )";
        // need to call parse passing in the input variables
        BaseNode functionBase = parse( inputExpression );

        assertThat( functionBase).isInstanceOf(FunctionInvocationNode.class);
        assertThat( functionBase.getText()).isEqualTo(inputExpression);

        FunctionInvocationNode function = (FunctionInvocationNode) functionBase;
        assertThat( function.getName()).isInstanceOf(NameRefNode.class);
        assertThat( function.getName().getText()).isEqualTo( "decision table");
        assertThat( function.getParams()).isInstanceOf(ListNode.class);
        assertThat( function.getParams().getElements()).hasSize(4);
        assertThat( function.getParams().getElements().get( 0 )).isInstanceOf(NamedParameterNode.class);
        assertThat( function.getParams().getElements().get( 1 )).isInstanceOf(NamedParameterNode.class);
        assertThat( function.getParams().getElements().get( 2 )).isInstanceOf(NamedParameterNode.class);
        assertThat( function.getParams().getElements().get( 3 )).isInstanceOf(NamedParameterNode.class);

        NamedParameterNode named = (NamedParameterNode) function.getParams().getElements().get( 0 );
        assertThat( named.getText()).isEqualTo( "outputs: \"Applicant Risk Rating\"");
        assertThat( named.getName().getText()).isEqualTo("outputs");
        assertThat( named.getExpression()).isInstanceOf(StringNode.class);
        assertThat( named.getExpression().getText()).isEqualTo( "\"Applicant Risk Rating\"");

        named = (NamedParameterNode) function.getParams().getElements().get( 1 );
        assertThat( named.getName().getText()).isEqualTo( "input expression list");
        assertThat( named.getExpression()).isInstanceOf(ListNode.class);

        ListNode list = (ListNode) named.getExpression();
        assertThat( list.getElements()).hasSize(2);
        assertThat( list.getElements().get( 0 )).isInstanceOf(StringNode.class);
        assertThat( list.getElements().get( 0 ).getText()).isEqualTo( "\"Applicant Age\"");
        assertThat( list.getElements().get( 1 )).isInstanceOf(StringNode.class);
        assertThat( list.getElements().get( 1 ).getText()).isEqualTo( "\"Medical History\"");

        named = (NamedParameterNode) function.getParams().getElements().get( 2 );
        assertThat( named.getName().getText()).isEqualTo( "rule list");
        assertThat( named.getExpression()).isInstanceOf(ListNode.class);

        list = (ListNode) named.getExpression();
        assertThat(list.getElements()).hasSize(5); // this assert on the 5 rows but third row contains the - operation which is not allowed in expression.
        assertThat( list.getElements().get( 0 )).isInstanceOf(ListNode.class);

        ListNode rule = (ListNode) list.getElements().get( 0 );
        assertThat( rule.getElements()).hasSize(3);
        assertThat( rule.getElements().get( 0 )).isInstanceOf(RangeNode.class);
        assertThat( rule.getElements().get( 0 ).getText()).isEqualTo( ">60");
        assertThat( rule.getElements().get( 1 )).isInstanceOf(StringNode.class);
        assertThat( rule.getElements().get( 1 ).getText()).isEqualTo( "\"good\"");
        assertThat( rule.getElements().get( 2 )).isInstanceOf(StringNode.class);
        assertThat( rule.getElements().get( 2 ).getText()).isEqualTo( "\"Medium\"");

        named = (NamedParameterNode) function.getParams().getElements().get( 3 );
        assertThat( named.getName().getText()).isEqualTo( "hit policy");
        assertThat( named.getExpression()).isInstanceOf(StringNode.class);
        assertThat( named.getExpression().getText()).isEqualTo( "\"Unique\"");
    }