diff options
Diffstat (limited to 'runtime/syntax/modula3.vim')
-rw-r--r-- | runtime/syntax/modula3.vim | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/runtime/syntax/modula3.vim b/runtime/syntax/modula3.vim new file mode 100644 index 0000000..67243db --- /dev/null +++ b/runtime/syntax/modula3.vim @@ -0,0 +1,145 @@ +" Vim syntax file +" Language: Modula-3 +" Maintainer: Doug Kearns <dougkearns@gmail.com> +" Previous Maintainer: Timo Pedersen <dat97tpe@ludat.lth.se> +" Last Change: 2022 Oct 31 + +if exists("b:current_syntax") + finish +endif + +" Whitespace errors {{{1 +if exists("modula3_space_errors") + if !exists("modula3_no_trail_space_error") + syn match modula3SpaceError display excludenl "\s\+$" + endif + if !exists("modula3_no_tab_space_error") + syn match modula3SpaceError display " \+\t"me=e-1 + endif +endif + +" Keywords {{{1 +syn keyword modula3Keyword ANY ARRAY AS BITS BRANDED BY CASE CONST +syn keyword modula3Keyword DEFINITION EVAL EXIT EXCEPT EXCEPTION EXIT +syn keyword modula3Keyword EXPORTS FINALLY FROM GENERIC IMPORT LOCK METHOD +syn keyword modula3Keyword OF RAISE RAISES READONLY RECORD REF +syn keyword modula3Keyword RETURN SET TRY TYPE TYPECASE UNSAFE +syn keyword modula3Keyword VALUE VAR WITH + +syn match modula3keyword "\<UNTRACED\>" + +" Special keywords, block delimiters etc +syn keyword modula3Block PROCEDURE FUNCTION MODULE INTERFACE REPEAT THEN +syn keyword modula3Block BEGIN END OBJECT METHODS OVERRIDES RECORD REVEAL +syn keyword modula3Block WHILE UNTIL DO TO IF FOR ELSIF ELSE LOOP + +" Reserved identifiers {{{1 +syn keyword modula3Identifier ABS ADR ADRSIZE BITSIZE BYTESIZE CEILING DEC +syn keyword modula3Identifier DISPOSE FIRST FLOAT FLOOR INC ISTYPE LAST +syn keyword modula3Identifier LOOPHOLE MAX MIN NARROW NEW NUMBER ORD ROUND +syn keyword modula3Identifier SUBARRAY TRUNC TYPECODE VAL + +" Predefined types {{{1 +syn keyword modula3Type ADDRESS BOOLEAN CARDINAL CHAR EXTENDED INTEGER +syn keyword modula3Type LONGCARD LONGINT LONGREAL MUTEX NULL REAL REFANY TEXT +syn keyword modula3Type WIDECHAR + +syn match modula3Type "\<\%(UNTRACED\s\+\)\=ROOT\>" + +" Operators {{{1 +syn keyword modula3Operator DIV MOD +syn keyword modula3Operator IN +syn keyword modula3Operator NOT AND OR + +" TODO: exclude = from declarations +if exists("modula3_operators") + syn match modula3Operator "\^" + syn match modula3Operator "[-+/*]" + syn match modula3Operator "&" + syn match modula3Operator "<=\|<:\@!\|>=\|>" + syn match modula3Operator ":\@<!=\|#" +endif + +" Literals {{{1 + +" Booleans +syn keyword modula3Boolean TRUE FALSE + +" Nil +syn keyword modula3Nil NIL + +" Numbers {{{2 + +" NOTE: Negated numbers are constant expressions not literals + +syn case ignore + + " Integers + + syn match modula3Integer "\<\d\+L\=\>" + + if exists("modula3_number_errors") + syn match modula3IntegerError "\<\d\d\=_\x\+L\=\>" + endif + + let s:digits = "0123456789ABCDEF" + for s:radix in range(2, 16) + exe $'syn match modula3Integer "\<{s:radix}_[{s:digits[:s:radix - 1]}]\+L\=\>"' + endfor + unlet s:digits s:radix + + " Reals + syn match modula3Real "\<\d\+\.\d\+\%([EDX][+-]\=\d\+\)\=\>" + +syn case match + +" Strings and characters {{{2 + +" String escape sequences +syn match modula3Escape "\\['"ntrf]" contained display +" TODO: limit to <= 377 (255) +syn match modula3Escape "\\\o\{3}" contained display +syn match modula3Escape "\\\\" contained display + +" Characters +syn match modula3Character "'\%([^']\|\\.\|\\\o\{3}\)'" contains=modula3Escape + +" Strings +syn region modula3String start=+"+ end=+"+ contains=modula3Escape + +" Pragmas {{{1 +" EXTERNAL INLINE ASSERT TRACE FATAL UNUSED OBSOLETE CALLBACK EXPORTED PRAGMA NOWARN LINE LL LL.sup SPEC +" Documented: INLINE ASSERT TRACE FATAL UNUSED OBSOLETE NOWARN +syn region modula3Pragma start="<\*" end="\*>" + +" Comments {{{1 +if !exists("modula3_no_comment_fold") + syn region modula3Comment start="(\*" end="\*)" contains=modula3Comment,@Spell fold + syn region modula3LineCommentBlock start="^\s*(\*.*\*)\s*\n\%(^\s*(\*.*\*)\s*$\)\@=" end="^\s*(\*.*\*)\s*\n\%(^\s*(\*.*\*)\s*$\)\@!" contains=modula3Comment transparent fold keepend +else + syn region modula3Comment start="(\*" end="\*)" contains=modula3Comment,@Spell +endif + +" Syncing "{{{1 +syn sync minlines=100 + +" Default highlighting {{{1 +hi def link modula3Block Statement +hi def link modula3Boolean Boolean +hi def link modula3Character Character +hi def link modula3Comment Comment +hi def link modula3Escape Special +hi def link modula3Identifier Keyword +hi def link modula3Integer Number +hi def link modula3Keyword Statement +hi def link modula3Nil Constant +hi def link modula3IntegerError Error +hi def link modula3Operator Operator +hi def link modula3Pragma PreProc +hi def link modula3Real Float +hi def link modula3String String +hi def link modula3Type Type "}}} + +let b:current_syntax = "modula3" + +" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: |