<?xml version="1.0" encoding="UTF-8" ?>
<!--
For learning making your language parser, please check the following link:
http://notepad-plus-plus.org/features/function-list.html
-->
<NotepadPlus>
	<functionList>
		<associationMap>
		<!-- langID:
			L_TEXT: 0     L_PHP: 1        L_C: 2        L_CPP: 3       L_CS: 4         L_OBJC: 5
			L_JAVA: 6     L_RC: 7         L_HTML: 8     L_XML: 9       L_MAKEFILE: 10  L_PASCAL: 11
			L_BATCH:12    L_INI: 13       L_ASCII: 14   L_USER: 15     L_ASP: 16       L_SQL: 17
			L_VB: 18      L_JS: 19        L_CSS: 20     L_PERL: 21     L_PYTHON: 22    L_LUA: 23
			L_TEX: 24     L_FORTRAN: 25   L_BASH: 26    L_FLASH: 27    L_NSIS: 28      L_TCL: 29
			L_LISP: 30    L_SCHEME: 31    L_ASM: 32     L_DIFF: 33     L_PROPS: 34     L_PS: 35
			L_RUBY: 36    L_SMALLTALK:37  L_VHDL: 38    L_KIX: 39      L_AU3: 40       L_CAML: 41
			L_ADA: 42     L_VERILOG: 43   L_MATLAB: 44  L_HASKELL: 45  L_INNO: 46      L_SEARCHRESULT: 47
			L_CMAKE: 48   L_YAML: 49      L_COBOL 50    L_GUI4CLI: 51  L_D: 52         L_POWERSHELL: 53
			L_R: 54       L_JSP: 55
		-->
			<association langID="1" id="php_function"/>
			<association langID="2" id="c_function"/>
			<association langID="3" id="c_cpp_function"/>
			<association langID="6" id="java"/>
			<association langID="9" id="xml_node"/>
			<association langID="12" id="batch_label"/>
			<association langID="13" id="ini_section"/>
			<association langID="19" id="js_function"/>
			<association langID="21" id="perl_function"/>
			<association langID="26" id="bash_function"/>
			<association langID="28" id="nsis_syntax"/>
		<!--
			if langID cannot be found above, you can still set the file extensions
			<association ext=".my_passer_ext1" id="my_passer_id"/>
			<association ext=".my_passer_ext2" id="my_passer_id"/>
			
			for User Defined Languages:
			<association userDefinedLangName="my user defined language" id="my_udl_passer_id"/>
			<association userDefinedLangName="Autocad" id="my_autocad_passer_id"/>
		-->

		</associationMap>
		<parsers>

			<parser id="xml_node" displayName="XML Node" commentExpr="&lt;!--([^-]|-(?!-&gt;))*--&gt;">
				<!-- Only match nodes with at least one attribute -->
				<function
				    mainExpr="&lt;[\w\?]+[\t ]+\w+[\t ]*=[\t ]*&quot;[^&quot;]+&quot;"
					displayMode="$functionName">
					<functionName>
						<nameExpr expr="[^&lt;]*"/>
					</functionName>
				</function>
			</parser>

			<parser id="batch_label" displayName="BAT Label" commentExpr="((::.*?$)|(REM.*?$))">
				<function
				    mainExpr="^[\t ]*:\w+"
					displayMode="$functionName">
					<functionName>
						<nameExpr expr="[^\t :]*"/>
					</functionName>
				</function>
			</parser>

			<parser id="ini_section" displayName="INI Section" commentExpr="((#.*?$)|(;.*?$))">
				<function
				    mainExpr="^[\t ]*[\[&quot;][\w_.; \(\)-]+[\]&quot;]"
					displayMode="$functionName">
					<functionName>
						<nameExpr expr="[^\[\]&quot;]*"/>
					</functionName>
				</function>
			</parser>

			<parser id="java" displayName="Java" commentExpr="((/\*.*?\*)/|(//.**$))">
				<classRange mainExpr="^[\t ]*((public|protected|private|static|final|abstract|synchronized|@(\w)+)\s+)*(class|enum|interface|@interface)\s+\w+(<\s*\w+(,\s*\w+)*\s*>)?(\s+extends\s+\w+)?(\s+implements\s+\w+(,\s*\w+)*)?\s*\{" openSymbole="\{" closeSymbole="\}">
					<className>
						<nameExpr expr="(class|enum|interface|@interface)\s+\w+(<\s*\w+(,\s*\w+)*\s*>)?"></nameExpr>
						<nameExpr expr="\s+\w+(<\s*\w+(,\s*\w+)*\s*>)?"></nameExpr>
						<nameExpr expr="\w+(<\s*\w+(,\s*\w+)*\s*>)?"></nameExpr>
					</className>
					<function mainExpr="^[\t ]*((public|protected|private|static|final|abstract|synchronized|@(\w)+)\s+)*(\w*(\[\s*])*\s+)?(?!(if|while|for|switch|catch|synchronized)\b)\w+(\[\s*])*(<\s*\w+(,\s*\w+)*\s*>)?\s*\([^\)\(]*\)(\s+throws\s+\w+)?\s*\{">
						<functionName>
							<funcNameExpr expr="(?!(if|while|for|switch|catch|synchronized)\b)\w+(\[\s*])*(<\s*\w+(,\s*\w+)*\s*>)?\s*\("></funcNameExpr>
							<funcNameExpr expr="(?!(if|while|for|switch|catch|synchronized)\b)\w+(\[\s*])*(<\s*\w+(,\s*\w+)*\s*>)?"></funcNameExpr>
						</functionName>
					</function>
				</classRange>
			</parser>

			<parser id="c_function" displayName="C source" commentExpr="((/\*.*?\*)/|(//.*?$))">
				<function
				    mainExpr="^[\t ]*((static|const|virtual)[\s]+)?[\w:]+([\s]+[\w]+)?([\s]+|\*[\s]+|[\s]+\*|[\s]+\*[\s]+)([\w_]+[\s]*::)?(?!(if|while|for))[\w_]+[\s]*\([^\)\(]*\)([\s]*const[\s]*)?[\n\s]*\{"
					displayMode="$functionName">
					<functionName>
						<nameExpr expr="(?!(if|while|for))[\w_~]+[\s]*\("/>
						<nameExpr expr="(?!(if|while|for))[\w_~]+"/>
					</functionName>
				</function>
			</parser>
			
			
			<parser id="js_function" displayName="Javascript" commentExpr="((/\*.*?\*)/|(//.*?$))">
				<function
				    mainExpr="((^|[\s]+|[;\}\.])([_A-Za-z][\w_]*\.)*[_A-Za-z][\w_]*[\s]*[=:]|^|[\s;\}]+)[\s]*function([\s]+[_A-Za-z]?[\w_]*\([^\)\(]*\)|\([^\)\(]*\))[\n\s]*\{"
					displayMode="$className->$functionName">
					<functionName>
						<nameExpr expr="[_A-Za-z][\w_]*[\s]*[=:]|[_A-Za-z]?[\w_]*[\s]*\("/>
						<nameExpr expr="[_A-Za-z]?[\w_]*"/>
					</functionName>
					<className>
						<nameExpr expr="([_A-Za-z][\w_]*\.)*[_A-Za-z][\w_]*\."/>
						<nameExpr expr="([_A-Za-z][\w_]*\.)*[_A-Za-z][\w_]*"/>
					</className>
				</function>
			</parser>
			

			<parser id="c_cpp_function" displayName="C++ Class" commentExpr="((/\*.*?\*)/|(//.*?$))">
				<classRange
					mainExpr="^[\t ]*(class|struct)[\t ]+[\w]+[\s]*(:[\s]*(public|protected|private)[\s]+[\w]+[\s]*)?\{"
					openSymbole = "\{"
					closeSymbole = "\}"
					displayMode="node">
					<className>
						<nameExpr expr="(class|struct)[\t ]+[\w]+"/>
						<nameExpr expr="[\t ]+[\w]+"/>
						<nameExpr expr="[\w]+"/>
					</className>
					<function
						mainExpr="^[\t ]*((static|const|virtual)[\s]+)?([\w]+([\s]+[\w]+)?([\s]+|\*[\s]+|[\s]+\*|[\s]+\*[\s]+))?([\w_]+[\s]*::)?(?!(if|while|for|switch))[\w_~]+[\s]*\([^\)\(]*\)([\s]*const[\s]*)?[\n\s]*\{">
						<functionName>
							<funcNameExpr expr="(?!(if|while|for|switch))[\w_~]+[\s]*\("/>
							<funcNameExpr expr="(?!(if|while|for|switch))[\w_~]+"/>
						</functionName>
					</function>
				</classRange>
				<function
				    mainExpr="^[\t ]*((static|const|virtual)[\s]+)?[\w]+([\s]+[\w]+)?([\s]+|\*[\s]+|[\s]+\*|[\s]+\*[\s]+)([\w_]+[\s]*::)?(?!(if|while|for))[\w_]+[\s]*\([^\)\(]*\)([\s]*const[\s]*)?[\n\s]*\{"
					displayMode="$className->$functionName">
					<functionName>
						<nameExpr expr="(?!(if|while|for))[\w_]+[\s]*\("/>
						<nameExpr expr="(?!(if|while|for))[\w_]+"/>
					</functionName>
					<className>
						<nameExpr expr="[\w_]+(?=[\s]*::)"/>
					</className>
				</function>
			</parser>
			
			<parser id="nsis_syntax" displayName="NSIS Syntax" commentExpr="((/\*.*?\*)/|(#.*?$)|(;.*?$))">
				<function
				    mainExpr="^[\t ]*(!macro|Function|Section|SectionGroup)[\t ]+[^\r\n]*$"
					displayMode="$functionName">
					<functionName>
						<nameExpr expr="(?(?=[\t ]*!macro)[\t ]*!macro[\t ]+[^\s]+|[^\r\n]*)"/>
					</functionName>
				</function>
			</parser>
			
			<parser id="perl_function" displayName="Perl">
				<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*\)?[\n\s]*\{" displayMode="$className->$functionName">
					<functionName>
						<nameExpr expr="(sub[\s]+)?\K[\w]+"/>
					</functionName>
					<className>
						<nameExpr expr="[\w]+(?=[\s]*::)"/>
					</className>
				</function>
			</parser>
			
            <parser id="php_function" displayName="PHP" commentExpr="((/\*.*?\*)/|(//.*?$))">
                <classRange
                    mainExpr="^[\s]*(class|abstract[\s]+class|final[\s]+class)[\t ]+[\w]+([\s]*|[\s]*(extends|implements)[\s]+[\w\\]+[\s]*)?\{"
                    openSymbole = "\{"
                    closeSymbole = "\}"
                    displayMode="node">
                    <className>
                        <nameExpr expr="(class|abstract[\s]+class|final[\s]+class)[\s]+[\w]+"/>
                        <nameExpr expr="[\s]+[\w]+\Z"/>
                        <nameExpr expr="[\w]+\Z"/>
                    </className>
                    <function
                        mainExpr="^[\s]*((static|public|protected|private|final)*(\s+(static|public|protected|private|final))+[\s]+)?(function[\s]+)+([\w]+([\s]+[\w]+)?([\s]+|\*[\s]+|[\s]+\*|[\s]+\*[\s]+))?([\w_]+[\s]*::)?(?!(if|while|for|switch))[\w_~]+[\s]*\([^\{]*\{">
                        <functionName>
                            <funcNameExpr expr="(?!(if|while|for|switch))[\w_]+[\s]*\([^\{]*"/>
                            <!-- comment below node if want display method with parmas -->
                            <funcNameExpr expr="(?!(if|while|for|switch))[\w_]+"/>
                        </functionName>
                    </function>
                </classRange>
                <function
                    mainExpr="^[\s]*function[\s]+\w+\("

                    displayMode="$className->$functionName">
                    <functionName>
                        <nameExpr expr="(?!(if|while|for))[\w_]+[\s]*\("/>
                        <nameExpr expr="(?!(if|while|for))[\w_]+"/>
                    </functionName>
                    <className>
                        <nameExpr expr="[\w_]+(?=[\s]*::)"/>
                    </className>
                </function>
            </parser>
			<parser id="bash_function" displayName="Shell" commentExpr="(#.*?$)">
				<function
					mainExpr="^[\t ]*(function[\t\r\n ]*)?([a-zA-Z0-9_])+[\t\r\n ]*(\([^\)]*\))?[\t\r\n ]*(\{)[^(\})\r\n\t ]*"
					displayMode="$functionName">
					<functionName>
						<nameExpr expr="[^{]*"/>
					</functionName>
				</function>
			</parser>
			
		</parsers>
	</functionList>
</NotepadPlus>
