mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	
		
			
	
	
		
			378 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			378 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " Vim syntax file | ||
|  | " Language:    Modula-2 (PIM) | ||
|  | " Maintainer:  B.Kowarsch <trijezdci@moc.liamg> | ||
|  | " Last Change: 2016 August 22 | ||
|  | 
 | ||
|  | " ---------------------------------------------------- | ||
|  | " THIS FILE IS LICENSED UNDER THE VIM LICENSE | ||
|  | " see https://github.com/vim/vim/blob/master/LICENSE | ||
|  | " ---------------------------------------------------- | ||
|  | 
 | ||
|  | " Remarks: | ||
|  | " Vim Syntax files are available for the following Modula-2 dialects: | ||
|  | " * for the PIM dialect : m2pim.vim (this file) | ||
|  | " * for the ISO dialect : m2iso.vim | ||
|  | " * for the R10 dialect : m2r10.vim | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " This syntax description follows the 3rd and 4th editions of N.Wirth's Book | ||
|  | " Programming in Modula-2 (aka PIM) plus the following language extensions: | ||
|  | " * non-leading, non-trailing, non-consecutive lowlines _ in identifiers | ||
|  | " * widely supported non-standard types BYTE, LONGCARD and LONGBITSET | ||
|  | " * non-nesting code disabling tags ?< and >? at the start of a line | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | 
 | ||
|  | " Parameters: | ||
|  | " | ||
|  | " Vim's filetype script recognises Modula-2 dialect tags within the first 200 | ||
|  | " lines of Modula-2 .def and .mod input files.  The script sets filetype and | ||
|  | " dialect automatically when a valid dialect tag is found in the input file. | ||
|  | " The dialect tag for the PIM dialect is (*!m2pim*).  It is recommended to put | ||
|  | " the tag immediately after the module header in the Modula-2 input file. | ||
|  | " | ||
|  | " Example: | ||
|  | "  DEFINITION MODULE Foolib; (*!m2pim*) | ||
|  | " | ||
|  | " Variable g:modula2_default_dialect sets the default Modula-2 dialect when the | ||
|  | " dialect cannot be determined from the contents of the Modula-2 input file: | ||
|  | " if defined and set to 'm2pim', the default dialect is PIM. | ||
|  | " | ||
|  | " Variable g:modula2_pim_allow_lowline controls support for lowline in identifiers: | ||
|  | " if defined and set to a non-zero value, they are recognised, otherwise not | ||
|  | " | ||
|  | " Variable g:modula2_pim_disallow_octals controls the rendering of octal literals: | ||
|  | " if defined and set to a non-zero value, they are rendered as errors. | ||
|  | " | ||
|  | " Variable g:modula2_pim_disallow_synonyms controls the rendering of & and ~: | ||
|  | " if defined and set to a non-zero value, they are rendered as errors. | ||
|  | " | ||
|  | " Variables may be defined in Vim startup file .vimrc | ||
|  | " | ||
|  | " Examples: | ||
|  | "  let g:modula2_default_dialect = 'm2pim' | ||
|  | "  let g:modula2_pim_allow_lowline = 1 | ||
|  | "  let g:modula2_pim_disallow_octals = 1 | ||
|  | "  let g:modula2_pim_disallow_synonyms = 1 | ||
|  | 
 | ||
|  | 
 | ||
|  | if exists("b:current_syntax") | ||
|  |   finish | ||
|  | endif | ||
|  | 
 | ||
|  | " Modula-2 is case sensitive | ||
|  | syn case match | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Reserved Words | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn keyword modula2Resword AND ARRAY BEGIN BY CASE CONST DEFINITION DIV DO ELSE | ||
|  | syn keyword modula2Resword ELSIF EXIT EXPORT FOR FROM IF IMPLEMENTATION IMPORT | ||
|  | syn keyword modula2Resword IN LOOP MOD NOT OF OR POINTER QUALIFIED RECORD REPEAT | ||
|  | syn keyword modula2Resword RETURN SET THEN TO TYPE UNTIL VAR WHILE WITH | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Builtin Constant Identifiers | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn keyword modula2ConstIdent FALSE NIL TRUE | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Builtin Type Identifiers | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn keyword modula2TypeIdent BITSET BOOLEAN CHAR PROC | ||
|  | syn keyword modula2TypeIdent CARDINAL INTEGER LONGINT REAL LONGREAL | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Builtin Procedure and Function Identifiers | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn keyword modula2ProcIdent CAP DEC EXCL HALT INC INCL | ||
|  | syn keyword modula2FuncIdent ABS CHR FLOAT HIGH MAX MIN ODD ORD SIZE TRUNC VAL | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Wirthian Macro Identifiers | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn keyword modula2MacroIdent NEW DISPOSE | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Unsafe Facilities via Pseudo-Module SYSTEM | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn keyword modula2UnsafeIdent ADDRESS PROCESS WORD | ||
|  | syn keyword modula2UnsafeIdent ADR TSIZE NEWPROCESS TRANSFER SYSTEM | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Non-Portable Language Extensions | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn keyword modula2NonPortableIdent BYTE LONGCARD LONGBITSET | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " User Defined Identifiers | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn match modula2Ident "[a-zA-Z][a-zA-Z0-9]*\(_\)\@!" | ||
|  | syn match modula2LowLineIdent "[a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)\+" | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " String Literals | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn region modula2String start=/"/ end=/"/ oneline | ||
|  | syn region modula2String start=/'/ end=/'/ oneline | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Numeric Literals | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn match modula2Num | ||
|  |   \ "\(\([0-7]\+\)[BC]\@!\|[89]\)[0-9]*\(\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?\)\?" | ||
|  | syn match modula2Num "[0-9A-F]\+H" | ||
|  | syn match modula2Octal "[0-7]\+[BC]" | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Punctuation | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn match modula2Punctuation | ||
|  |   \ "\.\|[,:;]\|\*\|[/+-]\|\#\|[=<>]\|\^\|\[\|\]\|(\(\*\)\@!\|[){}]" | ||
|  | syn match modula2Synonym "[&~]" | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Pragmas | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn region modula2Pragma start="(\*\$" end="\*)" | ||
|  | syn match modula2DialectTag "(\*!m2pim\(+[a-z0-9]\+\)\?\*)" | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Block Comments | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn region modula2Comment start="(\*\(\$\|!m2pim\(+[a-z0-9]\+\)\?\*)\)\@!" end="\*)" | ||
|  |   \ contains = modula2Comment, modula2CommentKey, modula2TechDebtMarker | ||
|  | syn match modula2CommentKey "[Aa]uthor[s]\?\|[Cc]opyright\|[Ll]icense\|[Ss]ynopsis" | ||
|  | syn match modula2CommentKey "\([Pp]re\|[Pp]ost\|[Ee]rror\)\-condition[s]\?:" | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Technical Debt Markers | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn keyword modula2TechDebtMarker contained DEPRECATED FIXME | ||
|  | syn match modula2TechDebtMarker "TODO[:]\?" contained | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Disabled Code Sections | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | syn region modula2DisabledCode start="^?<" end="^>?" | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Headers | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " !!! this section must be second last !!! | ||
|  | 
 | ||
|  | " new module header | ||
|  | syn match modula2ModuleHeader | ||
|  |   \ "MODULE\( [A-Z][a-zA-Z0-9]*\)\?" | ||
|  |   \ contains = modula2ReswordModule, modula2ModuleIdent | ||
|  | 
 | ||
|  | syn match modula2ModuleIdent | ||
|  |   \ "[A-Z][a-zA-Z0-9]*" contained | ||
|  | 
 | ||
|  | syn match modula2ModuleTail | ||
|  |   \ "END [A-Z][a-zA-Z0-9]*\.$" | ||
|  |   \ contains = modula2ReswordEnd, modula2ModuleIdent, modula2Punctuation | ||
|  | 
 | ||
|  | " new procedure header | ||
|  | syn match modula2ProcedureHeader | ||
|  |   \ "PROCEDURE\( [a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)*\)\?" | ||
|  |   \ contains = modula2ReswordProcedure, | ||
|  |   \ modula2ProcedureIdent, modula2ProcedureLowlineIdent, modula2IllegalChar, modula2IllegalIdent | ||
|  | 
 | ||
|  | syn match modula2ProcedureIdent | ||
|  |   \ "\([a-zA-Z]\)\([a-zA-Z0-9]*\)" contained | ||
|  | 
 | ||
|  | syn match modula2ProcedureLowlineIdent | ||
|  |   \ "[a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)\+" contained | ||
|  | 
 | ||
|  | syn match modula2ProcedureTail | ||
|  |   \ "END\( \([a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)*\)[.;]$\)\?" | ||
|  |   \ contains = modula2ReswordEnd, | ||
|  |   \ modula2ProcedureIdent, modula2ProcedureLowLineIdent, | ||
|  |   \ modula2Punctuation, modula2IllegalChar, modula2IllegalIdent | ||
|  | 
 | ||
|  | syn keyword modula2ReswordModule contained MODULE | ||
|  | syn keyword modula2ReswordProcedure contained PROCEDURE | ||
|  | syn keyword modula2ReswordEnd contained END | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Illegal Symbols | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " !!! this section must be last !!! | ||
|  | 
 | ||
|  | " any '`' '!' '@ ''$' '%' or '\' | ||
|  | syn match modula2IllegalChar "[`!@$%\\]" | ||
|  | 
 | ||
|  | " any solitary sequence of '_' | ||
|  | syn match modula2IllegalChar "\<_\+\>" | ||
|  | 
 | ||
|  | " any '?' at start of line if not followed by '<' | ||
|  | syn match modula2IllegalChar "^?\(<\)\@!" | ||
|  | 
 | ||
|  | " any '?' not following '>' at start of line | ||
|  | syn match modula2IllegalChar "\(\(^>\)\|\(^\)\)\@<!?" | ||
|  | 
 | ||
|  | " any identifiers with leading occurrences of '_' | ||
|  | syn match modula2IllegalIdent "_\+[a-zA-Z][a-zA-Z0-9]*\(_\+[a-zA-Z0-9]*\)*" | ||
|  | 
 | ||
|  | " any identifiers containing consecutive occurences of '_' | ||
|  | syn match modula2IllegalIdent | ||
|  |   \ "[a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)*\(__\+[a-zA-Z0-9]\+\(_[a-zA-Z0-9]\+\)*\)\+" | ||
|  | 
 | ||
|  | " any identifiers with trailing occurrences of '_' | ||
|  | syn match modula2IllegalIdent "[a-zA-Z][a-zA-Z0-9]*\(_\+[a-zA-Z0-9]\+\)*_\+\>" | ||
|  | 
 | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Define Rendering Styles | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | 
 | ||
|  | " highlight default link modula2PredefIdentStyle Keyword | ||
|  | " highlight default link modula2ConstIdentStyle modula2PredefIdentStyle | ||
|  | " highlight default link modula2TypeIdentStyle modula2PredefIdentStyle | ||
|  | " highlight default link modula2ProcIdentStyle modula2PredefIdentStyle | ||
|  | " highlight default link modula2FuncIdentStyle modula2PredefIdentStyle | ||
|  | " highlight default link modula2MacroIdentStyle modula2PredefIdentStyle | ||
|  | 
 | ||
|  | highlight default link modula2ConstIdentStyle Constant | ||
|  | highlight default link modula2TypeIdentStyle Type | ||
|  | highlight default link modula2ProcIdentStyle Function | ||
|  | highlight default link modula2FuncIdentStyle Function | ||
|  | highlight default link modula2MacroIdentStyle Function | ||
|  | highlight default link modula2UnsafeIdentStyle Question | ||
|  | highlight default link modula2NonPortableIdentStyle Question | ||
|  | highlight default link modula2StringLiteralStyle String | ||
|  | highlight default link modula2CommentStyle Comment | ||
|  | highlight default link modula2PragmaStyle PreProc | ||
|  | highlight default link modula2DialectTagStyle SpecialComment | ||
|  | highlight default link modula2TechDebtMarkerStyle SpecialComment | ||
|  | highlight default link modula2ReswordStyle Keyword | ||
|  | highlight default link modula2HeaderIdentStyle Function | ||
|  | highlight default link modula2UserDefIdentStyle Normal | ||
|  | highlight default link modula2NumericLiteralStyle Number | ||
|  | highlight default link modula2PunctuationStyle Delimiter | ||
|  | highlight default link modula2CommentKeyStyle SpecialComment | ||
|  | highlight default link modula2DisabledCodeStyle NonText | ||
|  | 
 | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | " Assign Rendering Styles | ||
|  | " ----------------------------------------------------------------------------- | ||
|  | 
 | ||
|  | " headers | ||
|  | highlight default link modula2ModuleIdent modula2HeaderIdentStyle | ||
|  | highlight default link modula2ProcedureIdent modula2HeaderIdentStyle | ||
|  | highlight default link modula2ModuleHeader Normal | ||
|  | highlight default link modula2ModuleTail Normal | ||
|  | highlight default link modula2ProcedureHeader Normal | ||
|  | highlight default link modula2ProcedureTail Normal | ||
|  | 
 | ||
|  | " lowline identifiers are rendered as errors if g:modula2_pim_allow_lowline is unset | ||
|  | if exists("g:modula2_pim_allow_lowline") | ||
|  |   if g:modula2_pim_allow_lowline != 0 | ||
|  |     highlight default link modula2ProcedureLowlineIdent modula2HeaderIdentStyle | ||
|  |   else | ||
|  |     highlight default link modula2ProcedureLowlineIdent Error | ||
|  |   endif | ||
|  | else | ||
|  |   highlight default link modula2ProcedureLowlineIdent Error | ||
|  | endif | ||
|  | 
 | ||
|  | " reserved words | ||
|  | highlight default link modula2Resword modula2ReswordStyle | ||
|  | highlight default link modula2ReswordModule modula2ReswordStyle | ||
|  | highlight default link modula2ReswordProcedure modula2ReswordStyle | ||
|  | highlight default link modula2ReswordEnd modula2ReswordStyle | ||
|  | 
 | ||
|  | " predefined identifiers | ||
|  | highlight default link modula2ConstIdent modula2ConstIdentStyle | ||
|  | highlight default link modula2TypeIdent modula2TypeIdentStyle | ||
|  | highlight default link modula2ProcIdent modula2ProcIdentStyle | ||
|  | highlight default link modula2FuncIdent modula2FuncIdentStyle | ||
|  | highlight default link modula2MacroIdent modula2MacroIdentStyle | ||
|  | 
 | ||
|  | " unsafe and non-portable identifiers | ||
|  | highlight default link modula2UnsafeIdent modula2UnsafeIdentStyle | ||
|  | highlight default link modula2NonPortableIdent modula2NonPortableIdentStyle | ||
|  | 
 | ||
|  | " user defined identifiers | ||
|  | highlight default link modula2Ident modula2UserDefIdentStyle | ||
|  | 
 | ||
|  | " lowline identifiers are rendered as errors if g:modula2_pim_allow_lowline is unset | ||
|  | if exists("g:modula2_pim_allow_lowline") | ||
|  |   if g:modula2_pim_allow_lowline != 0 | ||
|  |     highlight default link modula2LowLineIdent modula2UserDefIdentStyle | ||
|  |   else | ||
|  |     highlight default link modula2LowLineIdent Error | ||
|  |   endif | ||
|  | else | ||
|  |   highlight default link modula2LowLineIdent Error | ||
|  | endif | ||
|  | 
 | ||
|  | " literals | ||
|  | highlight default link modula2String modula2StringLiteralStyle | ||
|  | highlight default link modula2Num modula2NumericLiteralStyle | ||
|  | 
 | ||
|  | " octal literals are rendered as errors if g:modula2_pim_disallow_octals is set | ||
|  | if exists("g:modula2_pim_disallow_octals") | ||
|  |   if g:modula2_pim_disallow_octals != 0 | ||
|  |     highlight default link modula2Octal Error | ||
|  |   else | ||
|  |     highlight default link modula2Octal modula2NumericLiteralStyle | ||
|  |   endif | ||
|  | else | ||
|  |   highlight default link modula2Octal modula2NumericLiteralStyle | ||
|  | endif | ||
|  | 
 | ||
|  | " punctuation | ||
|  | highlight default link modula2Punctuation modula2PunctuationStyle | ||
|  | 
 | ||
|  | " synonyms & and ~ are rendered as errors if g:modula2_pim_disallow_synonyms is set | ||
|  | if exists("g:modula2_pim_disallow_synonyms") | ||
|  |   if g:modula2_pim_disallow_synonyms != 0 | ||
|  |     highlight default link modula2Synonym Error | ||
|  |   else | ||
|  |     highlight default link modula2Synonym modula2PunctuationStyle | ||
|  |   endif | ||
|  | else | ||
|  |   highlight default link modula2Synonym modula2PunctuationStyle | ||
|  | endif | ||
|  | 
 | ||
|  | " pragmas | ||
|  | highlight default link modula2Pragma modula2PragmaStyle | ||
|  | highlight default link modula2DialectTag modula2DialectTagStyle | ||
|  | 
 | ||
|  | " comments | ||
|  | highlight default link modula2Comment modula2CommentStyle | ||
|  | highlight default link modula2CommentKey modula2CommentKeyStyle | ||
|  | 
 | ||
|  | " technical debt markers | ||
|  | highlight default link modula2TechDebtMarker modula2TechDebtMarkerStyle | ||
|  | 
 | ||
|  | " disabled code | ||
|  | highlight default link modula2DisabledCode modula2DisabledCodeStyle | ||
|  | 
 | ||
|  | " illegal symbols | ||
|  | highlight default link modula2IllegalChar Error | ||
|  | highlight default link modula2IllegalIdent Error | ||
|  | 
 | ||
|  | 
 | ||
|  | let b:current_syntax = "modula2" | ||
|  | 
 | ||
|  | " vim: ts=4 | ||
|  | 
 | ||
|  | " END OF FILE |