nvim-rpgle/syntax/rpgle.vim
2024-10-30 12:04:08 +01:00

530 lines
20 KiB
VimL

" Vim syntax file
" Language: Free-Form ILE RPG
" Maintainer: Andreas Louv <andreas@louv.dk>
" Last Change: Oct 21, 2019
" Version: 81
" URL: https://github.com/andlrc/rpgle.vim
if exists('b:current_syntax')
finish
endif
"runtime! syntax/sqlanywhere.vim
syntax include @esql syntax/sqlanywhere.vim
let b:current_syntax = 'rpgle'
syntax case ignore
syntax iskeyword @,48-57,192-255,-,%,*,/,_
" Comments {{{
syntax match rpgleLineComment '//.*' contains=rpgleSpecialComment
\ contains=@rpgleCommentProps
syntax region rpgleBracketedComment start='/\*'
\ end='\*/'
\ contains=@rpgleCommentProps
" syntax keyword rpgleSpecialComment BESCHREIBUNG AUTHOR ERSTELLDATUM PROGRAMMNUTZEN
" \ ÄNDERUNGSDATUM
syntax match rpgleSpecialComment '\(programmnutzen:\|beschreibung:\|author:\|erstelldatum:\|änderungsdatum:\|beispielaufruf:\|compilebefehl:\)'
syntax cluster rpgleComment contains=rpgleLineComment,rpgleBracketedComment,rpgleSpecialComment
syntax cluster rpgleCommentProps contains=rpgleTodo,@Spell
syntax keyword rpgleTodo contained TODO FIXME
syntax match rpgleDsReference '\(\w\+\.\)\+\w\+' contained contains=rpgleDsPath
syntax match rpgleDsReferenceSql ':\(\w\+\.\)\+\w\+' contained contains=rpgleDsPath
syntax match rpgleDsPath '\(\w\|\.\)\+\ze\.' contained nextgroup=rpgledsSeperator
syntax match rpgleDsSeperator '\.' contained nextgroup=rpgleDsItem
syntax match rpgleDsItem '\w\+' contained
syntax match rpgleSqlReference ':\zs\w\+' contained
syntax keyword db2SqlKeywords CLOSQLCSR DATFMT
syntax keyword db2SqlValues *ENDMOD *NONE *ISO
" }}}
" Compiler directive {{{
syntax keyword rpglePreProc **FREE
syntax keyword rpglePreProc /COPY /DEFINE /EJECT /ELSE /ELSEIF /END-FREE
\ /ENDIF /EOF /FREE /IF /INCLUDE /RESTORE /SET
\ /SPACE /TITLE /UNDEFINE /SET
\ nextgroup=rpglePreProcValue
syntax match rpglePreProcValue /.*/ contained display
" }}}
" Header Specs {{{
" CTL-OPT ... ;
syntax region rpgleCtlSpec matchgroup=rpgleKeywords
\ start=/\<CTL-OPT\>/
\ end=/;/
\ contains=@rpgleCtlProps
syntax cluster rpgleCtlProps contains=rpgleCtlKeywords,rpgleNumber,
\@rpgleString,rpgleConstant,rpgleError,
\rpgleCtlParanBalance
syntax region rpgleCtlParanBalance matchgroup=xxx
\ start=/(/
\ end=/)/
\ contains=@rpgleCtlProps
" Header Keywords
syntax keyword rpgleCtlKeywords contained
\ ALLOC ACTGRP ALTSEQ ALWNULL AUT BNDDIR CCSID
\ CCSIDCVT COPYNEST COPYRIGHT CURSYM CVTOPT
\ DATEDIT DATFMT DCLOPT DEBUG DECEDIT DECPREC
\ DFTACTGRP DFTNAME ENBPFRCOL EXPROPTS
\ EXTBININT FIXNBR FLYDIV FORMSALIGN FTRANS
\ GENLVL INDENT INTPREC LANGID MAIN NOMAIN
\ OPENOPT OPTIMIZE OPTION PGMINFO PRFDTA
\ SRTSEQ STGMDL TEXT THREAD TIMFMT TRUNCNBR
\ USERPRF VALIDATE REQPREXP
" }}}
" Declaration Specs {{{
" Numbers and Strings
syntax match rpgleNumber display
\ /\<-\=\%(\d\|\.\)\+\>/
syntax match rpgleError /\%(^\|\W\)\@1<='\_.\{-}'\W\@=/
syntax match rpgleString /'\([+-]\n\|''\|[^']\)*'/ contains=rpgleStringProps
syntax cluster rpgleString contains=rpgleString
if get(g:, 'rpgle_spellString', 1)
syntax cluster rpgleStringProps contains=@Spell
endif
" Constants
syntax keyword rpgleConstant *ALL *BLANK *BLANKS *ENTRY *HIVAL *LOVAL *NULL
\ *OFF *ON *ZERO *ZEROS *LOCK *ISO0 *HMS0 *EUR *UTF8
\ *SYS *OMIT *ALLOC *REQUIRE *WARN *PROC *DATA
" *IN01 .. *IN99, *INH1 .. *INH9, *INL1 .. *INL9, *INLR, *INRT
syntax match rpgleSpecialKey display /\%(\*IN0[1-9]\|\*IN[1-9][0-9]\)/
syntax match rpgleSpecialKey display /\*INH[1-9]/
syntax match rpgleSpecialKey display /\*INL[1-9]/
syntax match rpgleSpecialKey display /\*INU[1-8]/
syntax keyword rpgleSpecialKey *INLR *INRT
" Operators
syntax match rpgleOperator display /<>/
syntax match rpgleOperator display />=/
syntax match rpgleOperator display /<=/
syntax match rpgleOperator display /\<in\>/
syntax match rpgleOperator display /\<to\>/
syntax match rpgleOperator display /\<downto\>/
syntax match rpgleOperator display /\<by\>/
syntax match rpgleOperator display /\<out\>/
syntax match rpgleOperator display /[*=><+]/
syntax match rpgleOperator display /\<-\>/
" Standalone, Constant
syntax region rpgleDclSpec display matchgroup=rpgleDclKeywords
\ start=/\<DCL-[SCF]\>/
\ end=/$/
\ contains=rpgleDclProp
" Procedure Interface
syntax keyword rpgleError END-PI
syntax region rpgleDclSpec matchgroup=rpgleDclKeywords
\ keepend
\ start=/\<DCL-PI\>/
\ end=/\<END-PI\>/
\ contains=rpgleDclProp,rpgleDclPiName
\ fold
" Special PI Name
syntax keyword rpgleDclPiName *N
" Prototype
syntax keyword rpgleError END-PR
syntax region rpgleDclSpec matchgroup=rpgleDclKeywords
\ keepend
\ start=/\<DCL-PR\>/
\ end=/\(\<END-PR\>\|OVERLOAD\)/
\ contains=rpgleDclProp
\ fold
" Data Structure
syntax keyword rpgleError LIKEDS LIKEREC END-DS
syntax keyword rpgleError ;;
syntax region rpgleDclSpec matchgroup=rpgleDclKeywords
\ keepend
\ start=/\<DCL-ENUM\>/
\ end=/\<END-ENUM\>/
\ contains=rpgleDclProp
syntax region rpgleDclSpec matchgroup=rpgleDclKeywords
\ keepend
\ start=/\<DCL-DS\>/
\ end=/\<END-DS\>/
\ contains=rpgleDclProp
" These this syntax regions cannot be "display", even though it is on one line,
" as the rule above could be matched wrongly then.
syntax region rpgleDclSpec matchgroup=rpgleDclKeywords
\ start=/\<DCL-DS\>\ze.*LIKEDS/
\ start=/\<DCL-DS\>\ze.*LIKEREC/
\ end=/$/
\ contains=rpgleDclProp
" Declaration Types
syntax keyword rpgleDclTypes contained
\ BINDEC CHAR DATE DATE FLOAT GRAPH IND INT OBJECT
\ PACKED POINTER TIME TIMESTAMP UCS2 UCS2 UNS
\ VARCHAR VARGRAPH VARUCS2 ZONED
" Declaration Keywords
syntax keyword rpgleDclKeywords contained
\ ALIAS ALIGN ALT ALTSEQ ASCEND BASED CCSID
\ CLASS CONST CTDATA DATFMT DESCEND DIM DTAARA
\ EXPORT EXT EXTFLD EXTFMT EXTNAME EXTPGM
\ EXTPROC FROMFILE IMPORT INZ LEN LIKE LIKEDS
\ LIKEFILE LIKEREC NOOPT NULLIND OCCURS OPDESC
\ OPTIONS OVERLAY PACKEVEN PERRCD POS PREFIX
\ PSDS QUALIFIED RTNPARM STATIC TEMPLATE TIMFMT
\ TOFILE VALUE PRINTER USROPN OFLIND INDDS WORKSTN
\ SFILE INFDS SQLTYPE OVERLOAD
" Declaration Constants
syntax keyword rpgleDclSpecialKeys contained
\ *NOPASS *OMIT *VARSIZE *STRING *RIGHTADJ *AUTO *VAR *DCLCASE *EXACT *NULLIND
\ *TRIM
syntax keyword rpgleDclSqlTypes contained
\ CLOB CLOB_LOCATOR DBCLOB DBCLOB_LOCATOR
\ BLOB BLOB_LOCATOR
\ BINARY VARBINARY
\ XML_CLOB XML_DBCLOB XML_BLOB XML_LOCATOR
\ XML_BLOB_FILE XML_CLOB_FILE XML_DBCLOB_FILE
\ BLOB_FILE CLOB_FILE DBCLOB_FILE
\ ROW_ID RESULT_SET_LOCATOR
syntax region rpgleDclParenBalance matchgroup=rpgleDclBrackets
\ start=/(/
\ end=/)/
\ contains=@rpgleComment,rpgleDclSpecialKeys,rpgleDclSqlTypes,
\rpgleNumber,@rpgleString,
\rpgleConstant,rpgleError,
\rpgleDclParenBalance,rpgleBIF
syntax match rpgleDclProp /\s*/ contained nextgroup=rpgleDclPropName
syntax match rpgleDclPropName /\k\+/ contained nextgroup=rpgleDclPropTail
\ contains=@rpgleComment
syntax match rpgleDclPropTail /.\+/ contained
\ contains=@rpgleComment,rpgleDclTypes,
\rpgleDclKeywords,rpgleError,
\rpgleDclParenBalance
" }}}
" Calculation Specs {{{
" IF ... ENDIF
syntax keyword rpgleError ENDIF
syntax region rpgleIf matchgroup=rpgleConditional
\ start=/\<IF\>/
\ end=/\<ENDIF\>/
\ contains=@rpgleNest,rpgleElse
\ fold
" ELSE ELSEIF
syntax keyword rpgleError ELSE ELSEIF
syntax keyword rpgleElse contained ELSE ELSEIF
" NOT, AND, OR
syntax keyword rpgleConditional NOT AND OR
" DOW .. ENDDO, DOU .. ENDDO
syntax keyword rpgleError ENDDO
syntax region rpgleDo matchgroup=rpgleRepeat
\ start=/\<DO[WU]\>/
\ end=/\<ENDDO\>/
\ contains=@rpgleNest
\ fold
" FOR ... ENDFOR
syntax region rpgleFor matchgroup=rpgleRepeat
\ start=/\<FOR\>/
\ end=/\<ENDFOR\>/
\ contains=@rpgleNest
\ fold
syntax keyword rpgleError ENDFOR
syntax region rpgleForEach matchgroup=rpgleRepeat
\ start=/\<FOR-EACH\>/
\ end=/\<ENDFOR\>/
\ contains=@rpgleNest
\ fold
" ITER, LEAVE
syntax keyword rpgleRepeat contained ITER LEAVE
" MONITOR ... ENDMON
syntax keyword rpgleError ENDMON
syntax region rpgleMonitor matchgroup=rpgleConditional
\ start=/\<MONITOR\>/
\ end=/\<ENDMON\>/
\ contains=@rpgleNest,rpgleOnError
\ fold
" ON-ERROR
syntax keyword rpgleError ON-ERROR
syntax keyword rpgleOnError contained ON-ERROR
" ON-EXIT
syntax keyword rpgleOnExit contained ON-EXIT
" SELECT ... ENDSL
syntax keyword rpgleError ENDSL
syntax region rpgleSelect matchgroup=rpgleKeywords
\ start=/\<SELECT\>/
\ end=/\<ENDSL\>/
\ contains=@rpgleNest,rpgleWhenOther
\ fold
" WHEN, OTHER
syntax keyword rpgleError WHEN OTHER
syntax keyword rpgleWhenOther contained WHEN OTHER
" Exec SQL
syntax region rpgleSql matchgroup=rpgleKeywords
\ start=/\<EXEC\_s\+SQL\>/
\ end=/;/
\ contains=@esql,rpgleDsReferenceSql,rpgleSqlReference,db2SqlKeywords,
\ db2SqlValues
" Build In Functions
syntax match rpgleError /%\w\+/
syntax keyword rpgleBIF %ABS
\ %ADDR
\ %ALLOC
\ %BITAND
\ %BITNOT
\ %BITOR
\ %BITXOR
\ %CHAR
\ %CHECK
\ %CHECKR
\ %DATA
\ %GEN
\ %OKEDOKE
\ %DATE
\ %DAYS
\ %DEC
\ %DECH
\ %DECPOS
\ %DIFF
\ %DIV
\ %EDITC
\ %EDITFLT
\ %EDITW
\ %ELEM
\ %EOF
\ %EQUAL
\ %ERROR
\ %FIELDS
\ %FLOAT
\ %FOUND
\ %GRAPH
\ %HANDLER
\ %HOURS
\ %INT
\ %INTH
\ %KDS
\ %LEN
\ %LOOKUP
\ %LOOKUPLT
\ %LOOKUPLE
\ %LOOKUPGT
\ %LOOKUPGE
\ %MAX
\ %MIN
\ %MINUTES
\ %MONTHS
\ %MSECONDS
\ %NULLIND
\ %OCCUR
\ %OPEN
\ %PADDR
\ %PARMS
\ %PARMNUM
\ %PARSER
\ %PROC
\ %REALLOC
\ %REM
\ %REPLACE
\ %SCAN
\ %SCANR
\ %SCANRPL
\ %SECONDS
\ %SHTDN
\ %SIZE
\ %SQRT
\ %STATUS
\ %STR
\ %SUBARR
\ %SUBDT
\ %SUBST
\ %THIS
\ %TIME
\ %TIMESTAMP
\ %TLOOKUPxx
\ %TRIM
\ %TRIML
\ %TRIMR
\ %UCS2
\ %UNS
\ %UNSH
\ %XFOOT
\ %XLATE
\ %XML
\ %YEARS
\ %RANGE
\ %LIST
\ %UPPER
\ %LOWER
" Procedures, the match group is to avoid infinite recursion as a
" ``rpgleProcCall'' can be within another ``rpgleProcCall''
syntax match rpgleError /)/
syntax region rpgleProcCall matchgroup=rpgleProcCallName
\ start=/%\@1<!\<\w\+(/
\ end=/)/
\ contains=@rpgleProcArgs
\ nextgroup=rpgleDsSeperator
"syntax region rpgleDsArray \.\w\+
syntax cluster rpgleProcArgs contains=rpgleBIF,@rpgleComment,rpgleConstant,
\rpgleNumber,rpglePreProc,rpgleProcCall,
\rpgleSpecialKey,
\@rpgleString,rpgleError,rpgleParenBalance,rpgleDsReference,
\rpgleConstant
syntax keyword rpgleKeywords RETURN
\ SORTA
\ SORTD
\ WRITE
\ OPEN
\ CLOSE
\ EXFMT
\ DSPLY
\ READC
\ CLEAR
\ DATA-GEN
\ READ
\ CHAIN
\ UPDATE
\ EVAL
\ EVALR
\ DUMP
" BEGSR .. ENDSR
syntax keyword rpgleError ENDSR
syntax region rpgleSub matchgroup=rpgleKeywords
\ start=/\<BEGSR\>/
\ end=/\<ENDSR\>/
\ contains=@rpgleNest
\ fold
" EXSR
syntax keyword rpgleKeywords EXSR
" }}}
" Procedure Specs {{{
syntax region rpgleDclProcBody matchgroup=rpgleDclProc
\ start=/\<DCL-PROC\>/
\ end=/\<END-PROC\>/
\ contains=@rpgleDclProcNest
\ fold
syntax cluster rpgleDclProcNest contains=@rpgleNest,rpgleSub,rpgleDclSpec,
\rpgleDclProcName,rpgleError,rpgleOnExit
syntax keyword rpgleError END-PROC
" Procedure Name
syntax match rpgleDclProcName display contained skipwhite
\ /\%(DCL-PROC\s\+\)\@10<=\w\+/
\ nextgroup=rpgleDclProcExport
" Export
syntax keyword rpgleDclProcExport contained EXPORT
" }}}
syntax region rpgleParenBalance matchgroup=rpgleBIFBrackets
\ start=/(/
\ end=/)/
\ contains=@rpgleNest
" All nestable groups, i.e. mostly Calculation Spec keywords:
syntax cluster rpgleNest contains=rpgleBIF,@rpgleComment,rpgleConditional,
\rpgleConstant,rpgleDo,rpgleFor,rpgleForEach,rpgleIf,
\rpgleKeywords,rpgleMonitor,rpgleNumber,
\rpgleOperator,rpglePreProc,rpgleProcCall,
\rpgleRepeat,rpgleSelect,rpgleSpecialKey,
\rpgleSql,@rpgleString,rpgleError,
\rpgleParenBalance,rpgleDsReference
"syntax match rpgleDclProcName display skipwhite /\k*\ze\((.*)\)/
syntax sync fromstart
highlight link rpgleProcCallName Function
highlight link rpgleError Error
highlight link rpglePreProc PreProc
highlight link rpgleProc Function
highlight link rpgleSpecialKey SpecialKey
highlight link rpgleNumber Number
highlight link rpgleString String
highlight link rpgleOperator Operator
highlight link rpgleComment Comment
highlight link rpgleSpecialComment SpecialComment
highlight link rpgleTodo Todo
highlight link rpgleConstant Constant
highlight link rpgleConditional Conditional
highlight link rpgleRepeat Repeat
highlight link rpgleKeywords Keyword
highlight link rpgleSpecial Special
highlight link rpgleTypes Type
highlight link rpgleDsReference Operator
highlight link rpgleDsPath PreProc
highlight link rpgleDsItem Identifier
highlight link rpgleSqlReference Identifier
highlight link db2SqlKeywords Conditional
highlight link db2SqlValues PreProc
highlight link rpgleLineComment rpgleComment
highlight link rpgleBracketedComment rpgleComment
highlight link rpgleCtlKeywords rpgleKeywords
highlight link rpgleDclTypes rpgleTypes
highlight link rpgleDclSqlTypes rpgleTypes
highlight link rpgleDclKeywords rpgleKeywords
highlight link rpgleDclProc rpgleKeywords
highlight link rpgleDclProcExport rpgleKeywords
highlight link rpgleDclProcName rpgleProc
highlight link rpgleDclPiName rpgleSpecial
highlight link rpgleDclSpecialKeys rpgleSpecialKey
highlight link rpgleElse rpgleConditional
highlight link rpgleOnError rpgleKeywords
highlight link rpgleOnExit rpgleKeywords
highlight link rpgleWhenOther rpgleKeywords
highlight link rpgleBIF rpgleSpecial
highlight link rpgleBIFBrackets rpgleSpecial
highlight link rpgleDclBrackets Comment
highlight link rpgleDclPropName Constant
" vim: foldmethod=marker