summaryrefslogtreecommitdiff
path: root/runtime/syntax/rexx.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/syntax/rexx.vim')
-rw-r--r--runtime/syntax/rexx.vim238
1 files changed, 165 insertions, 73 deletions
diff --git a/runtime/syntax/rexx.vim b/runtime/syntax/rexx.vim
index 179e453c9..b4d07323d 100644
--- 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 rexxIdentifier "\<[a-zA-Z\!\?_]\([a-zA-Z0-9._?!]\)*\>"
-syn match rexxEnvironmentSymbol "\<\.\+\([a-zA-Z0-9._?!]\)*\>"
+syn match rexxOperator "[=|\/\\\+\*\[\],;:<>&\~%\-]"
+" 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
-" Catch errors caused by wrong parenthesis
syn region rexxParen transparent start='(' end=')' contains=ALLBUT,rexxParenError,rexxTodo,rexxLabel,rexxKeyword
+" Catch errors caused by wrong parenthesis
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
-syn keyword rexxTodo contained TODO FIXME XXX
+" 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*\(--.*\|\/\*.*\)*$"
+
" 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
-
-" 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
-
-" Windows-only classes
-syn keyword rexxBuiltinClass .OLEObject .MenuObject .WindowsClipboard .WindowsEventLog
-syn keyword rexxBuiltinClass .WindowsManager .WindowObject .WindowsProgramManager
-
-
-" 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\|;\|$\)"
-
-syn region rexxDirective start="\(^\|;\)\s*::\s*\w\+" end="\($\|;\)" contains=rexxString,rexxComment,rexxLineComment,rexxClass,rexxMethod,rexxRoutine,rexxRequires keepend
+syn keyword rexxConst .true .false .nil .endOfLine .line
+syn match rexxNumber "\(-\|+\)\?\s*\zs\<\(\d\+\.\?\|\d*\.\d\+\(E\(+\|-\)\d\{2,2}\)\?\)\?\>"
+" 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
-if !exists("rexx_minlines")
-" let rexx_minlines = 10
- let rexx_minlines = 500
-endif
-exec "syn sync ccomment rexxComment minlines=" . rexx_minlines
+" Windows-only classes
+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"
+
+" 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
+
+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
+
+" 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_syn_inits")
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_syn_inits")
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_syn_inits")
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_syn_inits")
HiLink rexxParse rexxKeyword
HiLink rexxParse2 rexxParse
+ HiLink rexxGuard rexxKeyword
+ HiLink rexxTrace rexxKeyword
+
HiLink rexxRaise rexxKeyword
HiLink rexxRaise2 rexxRaise