User Defined Language functionlist parser only displays first function

  • This is my first attempt at any type of moderately complex regex. I was able to suss out a regex that worked perfectly in the search box. After hours of hacking away at the task I was able to get it to work in the FunctionList.xml…kind of. My problem now is that it only finds the first function in the program. Language at issue is HP TAL my parser is below:

          <parser id="tal_function" displayName="tal source" commentExpr="((!.*)/|(--.*?$))">
               <function  mainExpr="^.*(proc |subproc )"  displayMode="$functionName">
                                 <nameExpr expr="^.*(proc |subproc )\K[A-Z0-9._^+-]+"/>


    all that shows is:

                              |_ initialize^parameters

  • @L-Scherer Could you provide some TAL source examples for test/verification.

  • I’ll have to sanitize something and get it uploaded later today.

  • @MAPJe71 It’s kind of long-ish, but I wanted to mimic the complexity level and get all the examples in there. Essentially, there are procs, subprocs within them and a bunch of other stmts to include external content. The correct list of procs & subprocs should be 4 items: process^sqldata, just^for^compiling, get^mtext and format^date^time. I am currently dispaying only “get^mtext” (a subproc). No matter how I re-arrange procs, it always displays the 2nd-to-last in the function list. I’m sure that means something - just not sure what.

       ?sql wheneverlist
       ?source tal(directives)
       name bbctestpgm;
       !            U P D A T E   A U D I T   T R A I L
       !            ============================================
       !  CHG #    DATE    PERSON    DESCRIPTION
       !  -----  --------  ------  ----------------------------------------------------
       !   1234  11/15/17   LAS   Created.
       ?source cmncode(some^data)
       ?source LUListst
       ?source LUmlitst(LUmlits)
       ?source bbcrtnst(common^literals)
       int donestuff;
       literal stat^edit^error = 0,
               max^errors      = 1,
               max^ids   = 1,
               idx^data^inc   = 0,
               idx^data^incd   = 1,
               idx^data^mrules   = 2;
       int proc process^sqldata(table^nm,response^code,use^bbcsqlxb) variable;
          int table^nm;
          string .response^code;
          int use^bbcsqlxb;
          return true;
       int proc just^for^compiling;
              int subproc get^mtext(code,stat^id,response^code) variable;
                 int msg^code,
                 string .response^code;
                 return true;
       end;   ! just^for^compiling
       ?section format^date^time
       int proc format^date^time(tstamp,format^field);
          fixed tstamp;
          string .format^field;
          int dt[0:6];
          string month^name = 'p' := ["JanFebMarAprMayJunJulAugSepOctNovDec"];
          call interprettimestamp(tstamp,dt);
          call numout(format^field[0],dt[2],10,2);
          format^field[2] gets month^name[((dt[1] - 1) * 3)] for 3;
          call numout(format^field[5],dt[0],10,4);
          format^field[9] := " ";
          call numout(format^field[10],dt[3],10,2);
          format^field[12] := ":";
          call numout(format^field[13],dt[4],10,2);
          format^field[15] := ":";
          call numout(format^field[16],dt[5],10,2);
          return true;
       ?section procedure^end
       ?endif 15
       ?endif 15

  • @L-Scherer Please try the following parser:

    				displayName="TAL - Transaction Programming Language"
    				id         ="tal_function"
    				commentExpr="(?x)                                               # free-spacing (see `RegEx - Pattern Modifiers`)
    								(?m-s:(?:\x21|\x96{2}).*$)                      # Single Line Comment 1 and 2
    							|	(?:\x22[^\x22\r\n]*\x22)                        # String Literal - Double Quoted
    					mainExpr="(?x)                                              # free-spacing (see `RegEx - Pattern Modifiers`)
    							(?ms)                                               # - ^, $ and dot match at line-breaks
    							^\h*                                                # optional leading white-space at start-of-line
    							(?:int|string)                                      # function type specifier
    							\K                                                  # discard text matched so far
    							.*?                                                 # whatever, until...
    							;                                                   # ...end-of-function-header indicator
    						<nameExpr expr="[\w.^+-]+" />

  • @MAPJe71 YOU ROCK! thank you. My entire project team thanks you.