public Parser function() {
        if (functionParser == null) {
           FutureParser future = scoped("function");
           functionParser = future;
           future.setParser(
               sequence(
                   token("FUNCTION"),
                   choice(
                       sequence(
                           token("ABS"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("ACOS"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("ANNUITY"),
                           token("("),
                           argument(),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("ASIN"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("ATAN"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("BOOLEAN-OF-INTEGER"),
                           token("("),
                           argument(),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("BYTE-LENGTH"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("CHAR"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("CHAR-NATIONAL"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("COMBINED-DATETIME"),
                           token("("),
                           argument(),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("CONCATENATE"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("COS"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       token("CURRENT-DATE"),
                       sequence(
                           token("DATE-OF-INTEGER"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("DATE-TO-YYYYMMDD"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("DAY-OF-INTEGER"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("DAY-TO-YYYYDDD"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("DISPLAY-OF"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       token("E"),
                       token("EXCEPTION-FILE"),
                       token("EXCEPTION-LOCATION"),
                       token("EXCEPTION-STATEMENT"),
                       token("EXCEPTION-STATUS"),
                       sequence(
                           token("EXP"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("EXP10"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("FACTORIAL"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("FRACTION-PART"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("INTEGER"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("INTEGER-OF-BOOLEAN"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("INTEGER-OF-DATE"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("INTEGER-OF-DAY"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("INTEGER-PART"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("LENGTH"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("LENGTH-AN"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("LOCALE-DATE"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("LOCALE-TIME"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("LOCALE-TIME-FROM-SECS"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("LOG"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("LOG10"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("LOWER-CASE"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("MAX"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("MEAN"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("MEDIAN"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("MIDRANGE"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("MIN"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("MOD"),
                           token("("),
                           argument(),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("NATIONAL-OF"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("NUMVAL"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("NUMVAL-C"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("ORD"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("ORD-MAX"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("ORD-MIN"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       token("PI"),
                       sequence(
                           token("PRESENT-VALUE"),
                           token("("),
                           argument(),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("RANDOM"),
                           optional(
                               sequence(
                                   token("("),
                                   argument(),
                                   token(")")
                               )
                           )
                       ),
                       sequence(
                           token("RANGE"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("REM"),
                           token("("),
                           argument(),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("REVERSE"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("SECONDS-FROM-FORMATTED-TIME"),
                           token("("),
                           argument(),
                           argument(),
                           token(")")
                       ),
                       token("SECONDS-PAST-MIDNIGHT"),
                       sequence(
                           token("SIGN"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("SIN"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("SQRT"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("STANDARD-DEVIATION"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("STORED-CHAR-LENGTH"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("SUBSTITUTE"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("SUBSTITUTE-CASE"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("SUM"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           token("TAN"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("TEST-DATE-YYYYMMDD"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("TEST-DAY-YYYYDDD"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("TRIM"),
                           token("("),
                           argument(),
                           optional(
                               choice(
                                   token("LEADING"),
                                   token("TRAILING")
                               )
                           ),
                           token(")")
                       ),
                       sequence(
                           token("UPPER-CASE"),
                           token("("),
                           argument(),
                           token(")")
                       ),
                       sequence(
                           token("VARIANCE"),
                           token("("),
                           plus(
                               argument()
                           ),
                           token(")")
                       ),
                       token("WHEN-COMPILED"),
                       sequence(
                           token("YEAR-TO-YYYY"),
                           token("("),
                           argument(),
                           optional(
                               argument()
                           ),
                           token(")")
                       ),
                       sequence(
                           functionName(),
                           optional(
                               sequence(
                                   token("("),
                                   plus(
                                       argument()
                                   ),
                                   token(")")
                               )
                           )
                       )
                   )
               )
           );
        }

        return functionParser;
    }