Function list for user defined language



  • Hey guys,

    I’ve been playing around with the function list feature, and i’ve gotten to a point where i’m stuck.

    I can’t seem to upload files here so i have pasted the test file and the entries in the functionList.xml file after.

    Only the test1_parser works and i can see the “function”, i.e. Header, First, Second, … in the list. When i switch to the test2_parser the function list is empty.

    Does anyone know how to fix this problem? Ideally i would have one parser where the C---- entries can be folded and the K---- entries are contained in them.

    Thanks a lot in advance.

    ±-------------------------------------------------------------------------------+
    The file in Fortran free form:

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    C---- HEADER
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    @$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    @
    C---- FIRST
    @
    K---- TEST 1

    @$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    @
    C---- SECOND
    @
    K---- TEST 2

    @$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    @
    C---- THIRD
    @
    K---- TEST 3

    K---- TEST 4

    C---- END
    @$$$$$$$$$$$$$$$$$$$$$$$$$$ END $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

    ±-------------------------------------------------------------------------------+
    The entries in the functionList.xml file:

    <!--  === Test related parser associations ========================= -->
    <association langID="25" id="test1_parser"/>
    
      <!-- === Test related parsers ===================================== -->
    <parser id="test1_parser" displayName="Test1" commentExpr="(@.*?)$">
    	<function mainExpr="(^C----[\s]*[\w]*)" displayMode="$functionName">
    		<functionName> <nameExpr expr="[\s]+[\w]+" /></functionName>
    	</function>
    </parser>
    		
    <parser id="test2_parser" displayName="Test2" commentExpr="(@.*?)$">
    	<function mainExpr="(^K----[\s]*[\w]+*)" displayMode="$functionName">
    		<functionName> <nameExpr expr="[\s]+[\w]+" /></functionName>
    	</function>
    </parser>


  • Try one of these:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- ==========================================================================\
    |
    |   To learn how to make your own language parser, please check the following
    |   link:
    |       http://notepad-plus-plus.org/features/function-list.html
    |
    \=========================================================================== -->
    <NotepadPlus>
    	<functionList>
    		<associationMap>
    			<association id=     "fortran_freeform"      langID="25"                              />
    			<association id=     "fortran_fixedform"     langID="59"                              />
    		</associationMap>
    		<parsers>
    			<!-- ===================================================== [ Fortran ] -->
    
    			<!--
    			|   Based on:
    			|       https://community.notepad-plus-plus.org/topic/11059/custom-functions-list-rules
    			|       https://community.notepad-plus-plus.org/topic/13553/functionlist-xml-regular-expressions-not-parsing-properly
    			\-->
    			<parser
    				displayName="Fortran Free Form style - FORmula TRANslation"
    				id         ="fortran_freeform"
    				commentExpr="(?x)                                               # free-spacing (see `RegEx - Pattern Modifiers`)
    						(?m-s:!.*$)                                             # Single Line Comment
    					"
    			>
    				<function
    					mainExpr="(?x)                                              # free-spacing (see `RegEx - Pattern Modifiers`)
    							(?im-s)                                             # case-insensitive, ^ and $ match at line-breaks, dot does not
    							^\h*                                                # optional leading white-space at start-of-line
    							(?:
    								(?:
    									ELEMENTAL
    								|	(?:IM)?PURE
    								|	MODULE
    								|	(?:NON_)?RECURSIVE
    								)
    								\s+
    							)*
    							(?:FUNCTION|SUBROUTINE)\s+
    							\K                                                  # discard text matched so far
    							[A-Z]\w{0,62}                                       # valid character combination for identifiers
    							(?:\s*\([^()]*\))?                                  # optional parameter list
    						"
    				>
    					<!-- comment out the following node to display the method with its parameters -->
    					<functionName>
    						<nameExpr expr="\w+" />
    					</functionName>
    				</function>
    			</parser>
    			<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    			<parser
    				displayName="Fortran Fixed Form style - FORmula TRANslation"
    				id         ="fortran_fixedform"
    				commentExpr="(?x)                                               # free-spacing (see `RegEx - Pattern Modifiers`)
    						(?m-s:(?:!|^[Cc*].*$)                                   # Single Line Comment 1..3
    					"
    			>
    				<function
    					mainExpr="(?x)                                              # free-spacing (see `RegEx - Pattern Modifiers`)
    							(?im-s)                                             # case-insensitive, ^ and $ match at line-breaks, dot does not
    							^\h*                                                # optional leading white-space at start-of-line
    							(?:FUNCTION|SUBROUTINE)\s+
    							\K                                                  # discard text matched so far
    							[A-Z]\w{0,62}                                       # valid character combination for identifiers
    							(?:\s*\([^()]*\))?                                  # optional parameter list
    						"
    				>
    					<!-- comment out the following node to display the method with its parameters -->
    					<functionName>
    						<nameExpr expr="\w+" />
    					</functionName>
    				</function>
    			</parser>
    
    			<!-- =================================================== [ Fortran77 ] -->
    
    			<parser
    				displayName="[#4] Fortran77 (see Fortran Fixed Form style / fortran_fixedform)"
    				id         ="fortran77_syntax"
    			/>
    
    			<!-- ================================================================= -->
    		</parsers>
    	</functionList>
    </NotepadPlus>
    


  • Hello, @hristo-goumnerov, @MAPJe71 and All,

    To specifically match your text, Here is a possible parser :

      <!-- === Test related parsers ===================================== -->
                            <parser
                                id="Test_Parser" displayName="Test" commentExpr="^@.*?$" >
                                <function
                                    mainExpr="^(?-i)^(C|K).+?$"
                                >
                                    <functionName>
                                        <nameExpr expr="[\w\x20]+$" />
                                    </functionName>
                                </function>
                            </parser>
                
    

    I, then, realized that when, both, the function and class nodes are absent, the function name can be extracted, directly, from the mainExpr regex :-))

    So, this parser can even be shortened as :

       <!-- === Test related parsers ===================================== -->
                            <parser
                                id="Test_Parser" displayName="Test" commentExpr="^@.*?$" >
                                <function
                                    mainExpr="(?-i)^(C|K)----\h*\K.+?$" >
                                </function>
                            </parser>
                
    

    Remarks :

    • I simply used the line, below, to associate the parser to Normal text, for easier tests !
    			<association id= "Test_Parser" langID= "0" />
    
    • The name of this parser is Test_Parser, each word beginning with an upper-case letter

    Best Regards,

    guy038



  • Thanks a lot guys :)

    It works now.

    Best wishes.



  • A bonus question if anyone is still interested in helping a newbie :)

    I’m trying to make the function list show me the classes (starting with C—) and the functions (starting with K---- or S----), with the functions being inside of the classes. I got it to work so that the classes and the functions are shown, but the functions are not part of the classes, and when i collapse the classes they are empty. I’ve tried various versions of the below script, but to no avail. I’m sure that it has to be some minor fix. Thanks in advance.

    <parser
    displayName="hgg"
    id         ="hgg"
    commentExpr="(@.*?)$"
    >
        <classRange
    	mainExpr="(^C----.+?$)"
        >
    	<className>
    		<nameExpr expr=".+?$" />
    	</className>
    	<function
    		mainExpr="(^[KS]----.+?$)"
    	>
    		<functionName>
    			<nameExpr expr=".+?$" />
    		</functionName>
    	</function>
         </classRange>
    </parser>


  • This post is deleted!


  • Maybe FAQ Desk: Function List Basics will give you some ideas.


Log in to reply