diff runtime/syntax/rexx.vim @ 1624:18ee39301b82 v7.2a

updated for version 7.2a
author vimboss
date Tue, 24 Jun 2008 22:58:06 +0000
parents 1cdd2661f34c
children c3036f1dca68
line wrap: on
line diff
--- a/runtime/syntax/rexx.vim
+++ b/runtime/syntax/rexx.vim
@@ -4,6 +4,7 @@
 " Last Change:  2005 Dez  9, added some <http://www.ooRexx.org>-coloring,
 "                            line comments, do *over*, messages, directives,
 "                            highlighting classes, methods, routines and requires
+"               2007 Oct 17, added support for new ooRexx 3.2 features
 "               Rony G. Flatscher <rony.flatscher@wu-wien.ac.at>
 "
 " URL:		http://www.geulig.de/vim/rexx.vim
@@ -27,122 +28,194 @@ setlocal iskeyword+=!
 setlocal iskeyword+=?
 
 " ---rgf, position important: must be before comments etc. !
-syn match rexxOperator "[-=|\/\\\+\*\[\],;<>&\~]"
+syn match rexxOperator "[=|\/\\\+\*\[\],;:<>&\~%\-]"
 
-syn match rexxIdentifier        "\<[a-zA-Z\!\?_]\([a-zA-Z0-9._?!]\)*\>"
-syn match rexxEnvironmentSymbol "\<\.\+\([a-zA-Z0-9._?!]\)*\>"
-
+" rgf syn match rexxIdentifier        "\<[a-zA-Z\!\?_]\([a-zA-Z0-9._?!]\)*\>"
+syn match rexxIdentifier        "\<\K\k*\>"
+syn match rexxEnvironmentSymbol "\<\.\k\+\>"
 
 " A Keyword is the first symbol in a clause.  A clause begins at the start
 " of a line or after a semicolon.  THEN, ELSE, OTHERWISE, and colons are always
 " followed by an implied semicolon.
-syn match rexxClause "\(^\|;\|:\|then \|else \|otherwise \)\s*\w\+" contains=ALLBUT,rexxParse2,rexxRaise2
-
+syn match rexxClause "\(^\|;\|:\|then \|else \|when \|otherwise \)\s*\S*" contains=ALLBUT,rexxParse2,rexxRaise2,rexxForward2
 
 " Considered keywords when used together in a phrase and begin a clause
-syn match rexxParse "\<parse\s*\(\(upper\|lower\|caseless\)\s*\)\=\(arg\|linein\|pull\|source\|var\|\<value\>\|version\)\>"
-syn match rexxParse2 "\<with\>" contained containedin=rexxParse
-
+syn match rexxParse "\<parse\s*\(\(upper\|lower\|caseless\)\s*\)\?\(arg\|linein\|pull\|source\|var\|\<value\>\|version\)\>" containedin=rexxClause contains=rexxParse2
+syn match rexxParse2 "\<with\>" containedin=rexxParse
 
 syn match rexxKeyword contained "\<numeric \(digits\|form \(scientific\|engineering\|value\)\|fuzz\)\>"
-syn match rexxKeyword contained "\<\(address\|trace\)\( value\)\=\>"
-syn match rexxKeyword contained "\<procedure\(\s*expose\)\=\>"
-syn match rexxKeyword contained "\<do\>\(\s*forever\)\=\>"
-syn match rexxKeyword contained "\<use\>\s*\<arg\>"
+syn match rexxKeyword contained "\<\(address\|trace\)\( value\)\?\>"
+syn match rexxKeyword contained "\<procedure\(\s*expose\)\?\>"
+
+syn match rexxKeyword contained "\<\(do\|loop\)\>\(\s\+label\s\+\k*\)\?\(\s\+forever\)\?\>"
+syn match rexxKeyword contained "\<use\>\s*\(strict\s*\)\?\<arg\>"
 
 " Another keyword phrase, separated to aid highlighting in rexxFunction
-syn match rexxKeyword contained "\<signal\(\s*\(on\|off\)\s*\(any\|error\|failure\|halt\|lostdigits\|nomethod\|nostring\|notready\|novalue\|syntax\|user\s*\k*\)\(\s\+name\)\=\)\=\>"
-syn match rexxKeyword2 contained "\<call\(\s*\(on\|off\)\s*\(any\|error\|failure\|halt\|notready\|user\s*\k*\)\(\s\+name\)\=\)\=\>"
+syn match rexxRegularCallSignal contained "\<\(call\|signal\)\s\(\s*on\>\|\s*off\>\)\@!\(\k\+\ze\|\ze(\)\(\s*\|;\|$\|(\)"
+syn region rexxLabel contained start="\<\(call\|signal\)\>\s*\zs\(\k*\|(\)" end="\ze\(\s*\|;\|$\|(\)" containedin=rexxRegularCallSignal
+
+syn match rexxExceptionHandling contained "\<\(call\|signal\)\>\s\+\<\(on\|off\)\>.*\(;\|$\)"
 
+" hilite label given after keyword "name"
+syn match rexxLabel "name\s\+\zs\k\+\ze" containedin=rexxExceptionHandling
+" hilite condition name (serves as label)
+syn match rexxLabel "\<\(call\|signal\)\>\s\+\<\(on\|off\)\>\s*\zs\k\+\ze\s*\(;\|$\)" containedin=rexxExceptionHandling
+" user exception handling, hilite user defined name
+syn region rexxLabel contained start="user\s\+\zs\k" end="\ze\(\s\|;\|$\)" containedin=rexxExceptionHandling
 
 " Considered keywords when they begin a clause
-syn match rexxKeyword contained "\<\(arg\|do\|drop\|end\|exit\|expose\|forward\|if\|interpret\|iterate\|leave\|nop\)\>"
-syn match rexxKeyword contained "\<\(options\|pull\|push\|queue\|raise\|reply\|return\|say\|select\|trace\)\>"
+syn match rexxKeywordStatements "\<\(arg\|catch\|do\|drop\|end\|exit\|expose\|finally\|forward\|if\|interpret\|iterate\|leave\|loop\|nop\)\>"
+syn match rexxKeywordStatements "\<\(options\|pull\|push\|queue\|raise\|reply\|return\|say\|select\|trace\)\>"
+
+" Conditional keywords starting a new statement
+syn match rexxConditional "\<\(then\|else\|when\|otherwise\)\(\s*\|;\|\_$\|\)\>" contains=rexxKeywordStatements
 
 " Conditional phrases
-syn match rexxConditional  "\(^\s*\| \)\(to\|by\|for\|until\|while\|then\|when\|otherwise\|else\|over\)\( \|\s*$\)"
-syn match rexxConditional contained "\<\(to\|by\|for\|until\|while\|then\|when\|otherwise\|else\|over\)\>"
+syn match rexxLoopKeywords "\<\(to\|by\|for\|until\|while\|over\)\>" containedin=doLoopSelectLabelRegion
 
 " must be after Conditional phrases!
-syn match rexxKeyword ".*\<\(then\|else\)\s*\<do\>"
+syn match doLoopSelectLabelRegion "\<\(do\|loop\|select\)\>\s\+\(label\s\+\)\?\(\s\+\k\+\s\+\zs\<over\>\)\?\k*\(\s\+forever\)\?\(\s\|;\|$\)" 
+
+" color label's name
+syn match rexxLabel2 "\<\(do\|loop\|select\)\>\s\+label\s\+\zs\k*\ze" containedin=doLoopSelectLabelRegion
+
+" make sure control variable is normal
+syn match rexxControlVariable        "\<\(do\|loop\)\>\(\s\+label\s\+\k*\)\?\s\+\zs.*\ze\s\+\<over\>" containedin=doLoopSelectLabelRegion
+
+" make sure control variable assignment is normal
+syn match rexxStartValueAssignment       "\<\(do\|loop\)\>\(\s\+label\s\+\k*\)\?\s\+\zs.*\ze\(=.*\)\?\s\+\<to\>" containedin=doLoopSelectLabelRegion
+
+" highlight label name
+syn match endIterateLeaveLabelRegion "\<\(end\|leave\|iterate\)\>\(\s\+\K\k*\)" contains=rexxLabel2
+syn match rexxLabel2 "\<\(end\|leave\|iterate\)\>\s\+\zs\k*\ze" containedin=endIterateLeaveLabelRegion
+
+" Guard statement
+syn match rexxGuard "\(^\|;\|:\)\s*\<guard\>\s\+\<\(on\|off\)\>"
+
+" Trace statement
+syn match rexxTrace "\(^\|;\|:\)\s*\<trace\>\s\+\<\K\k*\>"
 
 " Raise statement
-syn match rexxRaise "\(^\|;\|:\)\s\+\<raise\>\s*\<\(propagate\|error\|failure\|syntax\|user\)\>\="
-syn match rexxRaise2 "\<\(additional\|array\|description\|exit\|return\)\>" contained containedin=rexxRaise
+syn match rexxRaise "\(^\|;\|:\)\s\+\<raise\>\s*\<\(propagate\|error\|failure\|syntax\|user\)\>\?" contains=rexxRaise2
+syn match rexxRaise2 "\<\(additional\|array\|description\|exit\|propagate\|return\)\>" containedin=rexxRaise
 
-" Forward statement keywords
-syn match rexxForward  "\(^\|;\|:\)\<forward\>\s*"
-syn match rexxForward2 "\<\(arguments\|array\|continue\|message\|class\|to\)\>" contained containedin=rexxForward
+" Forward statement
+syn match rexxForward  "\(^\|;\|:\)\<forward\>\s*" contains=rexxForward2
+syn match rexxForward2 "\<\(arguments\|array\|continue\|message\|class\|to\)\>" contained
 
 " Functions/Procedures
-syn match rexxFunction	"\<\w*\(/\*\s*\*/\)*("me=e-1 contains=rexxComment,rexxConditional,rexxKeyword,rexxIdentifier
-syn match rexxFunction 	"\<\<[a-zA-Z\!\?_]\([a-zA-Z0-9._?!]\)*\>("me=e-1
-syn match rexxFunction	"\<call\s\+\k\+\>"  contains=rexxKeyword2
+syn match rexxFunction 	"\<\<[a-zA-Z\!\?_]\k*\>("me=e-1
 syn match rexxFunction "[()]"
 
 " String constants
-syn region rexxString	  start=+"+ skip=+""+ end=+"\(x\|b\)\=+ oneline
-syn region rexxString	  start=+'+ skip=+''+ end=+'\(x\|b\)\=+ oneline
+syn region rexxString	start=+"+ skip=+""+ end=+"\(x\|b\)\?+ oneline
+syn region rexxString	start=+'+ skip=+''+ end=+'\(x\|b\)\?+ oneline
 
+syn region rexxParen transparent start='(' end=')' contains=ALLBUT,rexxParenError,rexxTodo,rexxLabel,rexxKeyword
 " Catch errors caused by wrong parenthesis
-syn region rexxParen transparent start='(' end=')' contains=ALLBUT,rexxParenError,rexxTodo,rexxLabel,rexxKeyword
 syn match rexxParenError	 ")"
 syn match rexxInParen		"[\\[\\]{}]"
 
 " Comments
-syn region rexxComment		start="/\*" end="\*/" contains=rexxTodo,rexxComment
-syn match  rexxCommentError	"\*/"
-syn match  rexxLineComment       /--.*/
+syn region	rexxComment	start="/\*"	end="\*/" contains=rexxTodo,rexxComment
+syn match	rexxCommentError "\*/"
+syn region	rexxLineComment	start="--"	end="\_$" oneline
+
+" Highlight User Labels
+" check for labels between comments, labels stated in a statement in the middle of a line
+syn match rexxLabel		 "\(\_^\|;\)\s*\(\/\*.*\*\/\)*\s*\k\+\s*\(\/\*.*\*\/\)*\s*:"me=e-1 contains=rexxTodo,rexxComment
 
 syn keyword rexxTodo contained	TODO FIXME XXX
 
-
 " ooRexx messages
 syn region rexxMessageOperator start="\(\~\|\~\~\)" end="\(\S\|\s\)"me=e-1
 syn match rexxMessage "\(\~\|\~\~\)\s*\<\.*[a-zA-Z]\([a-zA-Z0-9._?!]\)*\>" contains=rexxMessageOperator
 
-" Highlight User Labels
-syn match rexxLabel		 "^\s*\k*\s*:"me=e-1
+" line continuations, take care of (line-)comments after it
+syn match rexxLineContinue ",\ze\s*\(--.*\|\/\*.*\)*$"
 
-syn match rexxLineContinue ",\ze\s*\(--.*\|\/\*.*\)*$"
 " the following is necessary, otherwise three consecutive dashes will cause it to highlight the first one
-syn match rexxLineContinue "-\ze\(\s+--.*\|\s*\/\*.*\)*$"
+syn match rexxLineContinue "-\ze-\@!\s*\(--.*\|\s*\/\*.*\)\?$"
 
 " Special Variables
 syn keyword rexxSpecialVariable  sigl rc result self super
+syn keyword rexxSpecialVariable  .environment .error .input .local .methods .output .rs .stderr .stdin .stdout .stdque
 
 " Constants
-syn keyword rexxConst .true .false .nil
+syn keyword rexxConst .true .false .nil .endOfLine .line
+
+syn match rexxNumber "\(-\|+\)\?\s*\zs\<\(\d\+\.\?\|\d*\.\d\+\(E\(+\|-\)\d\{2,2}\)\?\)\?\>"
 
-" ooRexx builtin classes, first define dot to be o.k. in keywords
-syn keyword rexxBuiltinClass .object .class .method .message
-syn keyword rexxBuiltinClass .monitor .alarm
-syn keyword rexxBuiltinClass .stem .stream .string
-syn keyword rexxBuiltinClass .mutablebuffer
-syn keyword rexxBuiltinClass .array .list .queue .directory .table .set
-syn keyword rexxBuiltinClass .relation .bag .supplier .regularExpressions
+" ooRexx builtin classes (as of version 3.2.0, fall 2007), first define dot to be o.k. in keywords
+syn keyword rexxBuiltinClass .Alarm .ArgUtil .Array .Bag .CaselessColumnComparator
+syn keyword rexxBuiltinClass .CaselessComparator .CaselessDescendingComparator .CircularQueue
+syn keyword rexxBuiltinClass .Class .Collection .ColumnComparator .Comparable .Comparator
+syn keyword rexxBuiltinClass .DateTime .DescendingComparator .Directory .InputOutputStream
+syn keyword rexxBuiltinClass .InputStream .InvertingComparator .List .MapCollection
+syn keyword rexxBuiltinClass .Message .Method .Monitor .MutableBuffer .Object
+syn keyword rexxBuiltinClass .OrderedCollection .OutputStream .Properties .Queue
+syn keyword rexxBuiltinClass .Relation .RexxQueue .Set .SetCollection .Stem .Stream
+syn keyword rexxBuiltinClass .StreamSupplier .String .Supplier .Table .TimeSpan
 
 " Windows-only classes
-syn keyword rexxBuiltinClass .OLEObject .MenuObject .WindowsClipboard .WindowsEventLog
-syn keyword rexxBuiltinClass .WindowsManager .WindowObject .WindowsProgramManager
+syn keyword rexxBuiltinClass .AdvancedControls .AnimatedButton .BaseDialog .ButtonControl
+syn keyword rexxBuiltinClass .CategoryDialog .CheckBox .CheckList .ComboBox .DialogControl
+syn keyword rexxBuiltinClass .DialogExtensions .DlgArea .DlgAreaU .DynamicDialog
+syn keyword rexxBuiltinClass .EditControl .InputBox .IntegerBox .ListBox .ListChoice
+syn keyword rexxBuiltinClass .ListControl .MenuObject .MessageExtensions .MultiInputBox
+syn keyword rexxBuiltinClass .MultiListChoice .PasswordBox .PlainBaseDialog .PlainUserDialog
+syn keyword rexxBuiltinClass .ProgressBar .ProgressIndicator .PropertySheet .RadioButton
+syn keyword rexxBuiltinClass .RcDialog .ResDialog .ScrollBar .SingleSelection .SliderControl
+syn keyword rexxBuiltinClass .StateIndicator .StaticControl .TabControl .TimedMessage
+syn keyword rexxBuiltinClass .TreeControl .UserDialog .VirtualKeyCodes .WindowBase
+syn keyword rexxBuiltinClass .WindowExtensions .WindowObject .WindowsClassesBase .WindowsClipboard
+syn keyword rexxBuiltinClass .WindowsEventLog .WindowsManager .WindowsProgramManager .WindowsRegistry
 
+" ooRexx directives, ---rgf location important, otherwise directives in top of file not matched!
+syn region rexxClassDirective     start="::\s*class\s*"ms=e+1    end="\ze\(\s\|;\|$\)"
+syn region rexxMethodDirective    start="::\s*method\s*"ms=e+1   end="\ze\(\s\|;\|$\)"
+syn region rexxRequiresDirective  start="::\s*requires\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+syn region rexxRoutineDirective   start="::\s*routine\s*"ms=e+1  end="\ze\(\s\|;\|$\)"
+syn region rexxAttributeDirective start="::\s*attribute\s*"ms=e+1  end="\ze\(\s\|;\|$\)"
+
+syn region rexxDirective start="\(^\|;\)\s*::\s*\w\+"  end="\($\|;\)" contains=rexxString,rexxComment,rexxLineComment,rexxClassDirective,rexxMethodDirective,rexxRoutineDirective,rexxRequiresDirective,rexxAttributeDirective keepend
+
+syn region rexxVariable start="\zs\<\(\.\)\@!\K\k\+\>\ze\s*\(=\|,\|)\|%\|\]\|\\\||\|&\|+=\|-=\|<\|>\)" end="\(\_$\|.\)"me=e-1
+syn match rexxVariable "\(=\|,\|)\|%\|\]\|\\\||\|&\|+=\|-=\|<\|>\)\s*\zs\K\k*\ze" 
 
-" ooRexx directives, ---rgf location important, otherwise directives in top of
-" file not matched!
-syn region rexxClass    start="::\s*class\s*"ms=e+1    end="\ze\(\s\|;\|$\)"
-syn region rexxMethod   start="::\s*method\s*"ms=e+1   end="\ze\(\s\|;\|$\)"
-syn region rexxRequires start="::\s*requires\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
-syn region rexxRoutine  start="::\s*routine\s*"ms=e+1  end="\ze\(\s\|;\|$\)"
+" rgf, 2007-07-22: unfortunately, the entire region is colored (not only the
+" patterns), hence useless (vim 7.0)! (syntax-docs hint that that should work)
+" attempt: just colorize the parenthesis in matching colors, keep content
+"          transparent to keep the formatting already done to it!
+" syn region par1 matchgroup=par1 start="(" matchgroup=par1 end=")" transparent contains=par2
+" syn region par2 matchgroup=par2 start="(" matchgroup=par2 end=")" transparent contains=par3 contained
+" syn region par3 matchgroup=par3 start="(" matchgroup=par3 end=")" transparent contains=par4 contained
+" syn region par4 matchgroup=par4 start="(" matchgroup=par4 end=")" transparent contains=par5 contained
+" syn region par5 matchgroup=par5 start="(" matchgroup=par5 end=")" transparent contains=par1 contained
+
+" this will colorize the entire region, removing any colorizing already done!
+" syn region par1 matchgroup=par1 start="(" end=")" contains=par2
+" syn region par2 matchgroup=par2 start="(" end=")" contains=par3 contained
+" syn region par3 matchgroup=par3 start="(" end=")" contains=par4 contained
+" syn region par4 matchgroup=par4 start="(" end=")" contains=par5 contained
+" syn region par5 matchgroup=par5 start="(" end=")" contains=par1 contained
 
-syn region rexxDirective start="\(^\|;\)\s*::\s*\w\+"  end="\($\|;\)" contains=rexxString,rexxComment,rexxLineComment,rexxClass,rexxMethod,rexxRoutine,rexxRequires keepend
-
-
+hi par1 ctermfg=red 		guifg=red
+hi par2 ctermfg=blue 		guifg=blue
+hi par3 ctermfg=darkgreen 	guifg=darkgreen
+hi par4 ctermfg=darkyellow	guifg=darkyellow
+hi par5 ctermfg=darkgrey 	guifg=darkgrey
 
-if !exists("rexx_minlines")
-"  let rexx_minlines = 10
-  let rexx_minlines = 500
-endif
-exec "syn sync ccomment rexxComment minlines=" . rexx_minlines
+" line continuation (trailing comma or single dash)
+syn sync linecont "\(,\|-\ze-\@!\)\ze\s*\(--.*\|\/\*.*\)*$"
+
+" if !exists("rexx_minlines")
+"   let rexx_minlines = 500
+" endif
+" exec "syn sync ccomment rexxComment minlines=" . rexx_minlines
+
+" always scan from start, PCs are powerful enough for that in 2007 !
+exec "syn sync fromstart"
 
 " Define the default highlighting.
 " For version 5.7 and earlier: only when not done already
@@ -155,6 +228,20 @@ if version >= 508 || !exists("did_rexx_s
     command -nargs=+ HiLink hi def link <args>
   endif
 
+  " make binary and hex strings stand out
+  hi rexxStringConstant term=bold,underline ctermfg=5 cterm=bold guifg=darkMagenta gui=bold
+
+  HiLink rexxLabel2		Function
+  HiLink doLoopSelectLabelRegion	rexxKeyword
+  HiLink endIterateLeaveLabelRegion	rexxKeyword
+  HiLink rexxLoopKeywords	rexxKeyword " Todo
+
+  HiLink rexxNumber		Normal	
+"  HiLink rexxIdentifier		DiffChange
+
+  HiLink rexxRegularCallSignal	Statement
+  HiLink rexxExceptionHandling	Statement
+
   HiLink rexxLabel		Function
   HiLink rexxCharacter		Character
   HiLink rexxParenError		rexxError
@@ -162,7 +249,8 @@ if version >= 508 || !exists("did_rexx_s
   HiLink rexxCommentError	rexxError
   HiLink rexxError		Error
   HiLink rexxKeyword		Statement
-  HiLink rexxKeyword2		rexxKeyword
+  HiLink rexxKeywordStatements	Statement  
+
   HiLink rexxFunction		Function
   HiLink rexxString		String
   HiLink rexxComment		Comment
@@ -172,15 +260,16 @@ if version >= 508 || !exists("did_rexx_s
 
   HiLink rexxOperator		Operator
   HiLink rexxMessageOperator	rexxOperator
-  HiLink rexxLineComment	RexxComment
+  HiLink rexxLineComment	Comment
 
   HiLink rexxLineContinue	WildMenu
 
   HiLink rexxDirective		rexxKeyword
-  HiLink rexxClass              Type
-  HiLink rexxMethod             rexxFunction
-  HiLink rexxRequires           Include
-  HiLink rexxRoutine            rexxFunction
+  HiLink rexxClassDirective	Type
+  HiLink rexxMethodDirective	rexxFunction
+  HiLink rexxAttributeDirective	rexxFunction
+  HiLink rexxRequiresDirective	Include
+  HiLink rexxRoutineDirective	rexxFunction
 
   HiLink rexxConst		Constant
   HiLink rexxTypeSpecifier	Type
@@ -192,6 +281,9 @@ if version >= 508 || !exists("did_rexx_s
   HiLink rexxParse              rexxKeyword
   HiLink rexxParse2             rexxParse
 
+  HiLink rexxGuard              rexxKeyword
+  HiLink rexxTrace              rexxKeyword
+
   HiLink rexxRaise              rexxKeyword
   HiLink rexxRaise2             rexxRaise