1" Vim syntax file
2" Language:   COBOL
3" Maintainer: Tim Pope <vimNOSPAM@tpope.info>
4"     (formerly Davyd Ondrejko <vondraco@columbus.rr.com>)
5"     (formerly Sitaram Chamarty <sitaram@diac.com> and
6"		    James Mitchell <james_mitchell@acm.org>)
7" $Id: cobol.vim,v 1.2 2007/05/05 18:23:43 vimboss Exp $
8
9" For version 5.x: Clear all syntax items
10" For version 6.x: Quit when a syntax file was already loaded
11if version < 600
12  syntax clear
13elseif exists("b:current_syntax")
14  finish
15endif
16
17" MOST important - else most of the keywords wont work!
18if version < 600
19  set isk=@,48-57,-
20else
21  setlocal isk=@,48-57,-
22endif
23
24syn case ignore
25
26syn cluster cobolStart      contains=cobolAreaA,cobolAreaB,cobolComment,cobolCompiler
27syn cluster cobolAreaA      contains=cobolParagraph,cobolSection,cobolDivision
28"syn cluster cobolAreaB      contains=
29syn cluster cobolAreaAB     contains=cobolLine
30syn cluster cobolLine       contains=cobolReserved
31syn match   cobolMarker     "^\%( \{,5\}[^ ]\)\@=.\{,6}" nextgroup=@cobolStart
32syn match   cobolSpace      "^ \{6\}"  nextgroup=@cobolStart
33syn match   cobolAreaA      " \{1,4\}"  contained nextgroup=@cobolAreaA,@cobolAreaAB
34syn match   cobolAreaB      " \{5,\}\|- *" contained nextgroup=@cobolAreaB,@cobolAreaAB
35syn match   cobolComment    "[/*C].*$" contained
36syn match   cobolCompiler   "$.*$"     contained
37syn match   cobolLine       ".*$"      contained contains=cobolReserved,@cobolLine
38
39syn match   cobolDivision       "[A-Z][A-Z0-9-]*[A-Z0-9]\s\+DIVISION\."he=e-1 contained contains=cobolDivisionName
40syn keyword cobolDivisionName   contained IDENTIFICATION ENVIRONMENT DATA PROCEDURE
41syn match   cobolSection        "[A-Z][A-Z0-9-]*[A-Z0-9]\s\+SECTION\."he=e-1  contained contains=cobolSectionName
42syn keyword cobolSectionName    contained CONFIGURATION INPUT-OUTPUT FILE WORKING-STORAGE LOCAL-STORAGE LINKAGE
43syn match   cobolParagraph      "\a[A-Z0-9-]*[A-Z0-9]\.\|\d[A-Z0-9-]*[A-Z]\."he=e-1             contained contains=cobolParagraphName
44syn keyword cobolParagraphName  contained PROGRAM-ID SOURCE-COMPUTER OBJECT-COMPUTER SPECIAL-NAMES FILE-CONTROL I-O-CONTROL
45
46
47"syn match cobolKeys "^\a\{1,6\}" contains=cobolReserved
48syn keyword cobolReserved contained ACCEPT ACCESS ADD ADDRESS ADVANCING AFTER ALPHABET ALPHABETIC
49syn keyword cobolReserved contained ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED ALS
50syn keyword cobolReserved contained ALTERNATE AND ANY ARE AREA AREAS ASCENDING ASSIGN AT AUTHOR BEFORE BINARY
51syn keyword cobolReserved contained BLANK BLOCK BOTTOM BY CANCEL CBLL CD CF CH CHARACTER CHARACTERS CLASS
52syn keyword cobolReserved contained CLOCK-UNITS CLOSE COBOL CODE CODE-SET COLLATING COLUMN COMMA COMMON
53syn keyword cobolReserved contained COMMUNICATIONS COMPUTATIONAL COMPUTE CONTENT CONTINUE
54syn keyword cobolReserved contained CONTROL CONVERTING CORR CORRESPONDING COUNT CURRENCY DATE DATE-COMPILED
55syn keyword cobolReserved contained DATE-WRITTEN DAY DAY-OF-WEEK DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE
56syn keyword cobolReserved contained DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING DECIMAL-POINT
57syn keyword cobolReserved contained DELARATIVES DELETE DELIMITED DELIMITER DEPENDING DESCENDING DESTINATION
58syn keyword cobolReserved contained DETAIL DISABLE DISPLAY DIVIDE DIVISION DOWN DUPLICATES DYNAMIC EGI ELSE EMI
59syn keyword cobolReserved contained ENABLE END-ADD END-COMPUTE END-DELETE END-DIVIDE END-EVALUATE END-IF
60syn keyword cobolReserved contained END-MULTIPLY END-OF-PAGE END-READ END-RECEIVE END-RETURN
61syn keyword cobolReserved contained END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT END-UNSTRING
62syn keyword cobolReserved contained END-WRITE EQUAL ERROR ESI EVALUATE EVERY EXCEPTION EXIT
63syn keyword cobolReserved contained EXTEND EXTERNAL FALSE FD FILLER FINAL FIRST FOOTING FOR FROM
64syn keyword cobolReserved contained GENERATE GIVING GLOBAL GREATER GROUP HEADING HIGH-VALUE HIGH-VALUES I-O
65syn keyword cobolReserved contained IN INDEX INDEXED INDICATE INITIAL INITIALIZE
66syn keyword cobolReserved contained INITIATE INPUT INSPECT INSTALLATION INTO IS JUST
67syn keyword cobolReserved contained JUSTIFIED KEY LABEL LAST LEADING LEFT LENGTH LOCK MEMORY
68syn keyword cobolReserved contained MERGE MESSAGE MODE MODULES MOVE MULTIPLE MULTIPLY NATIVE NEGATIVE NEXT NO NOT
69syn keyword cobolReserved contained NUMBER NUMERIC NUMERIC-EDITED OCCURS OF OFF OMITTED ON OPEN
70syn keyword cobolReserved contained OPTIONAL OR ORDER ORGANIZATION OTHER OUTPUT OVERFLOW PACKED-DECIMAL PADDING
71syn keyword cobolReserved contained PAGE PAGE-COUNTER PERFORM PF PH PIC PICTURE PLUS POINTER POSITION POSITIVE
72syn keyword cobolReserved contained PRINTING PROCEDURES PROCEDD PROGRAM PURGE QUEUE QUOTES
73syn keyword cobolReserved contained RANDOM RD READ RECEIVE RECORD RECORDS REDEFINES REEL REFERENCE REFERENCES
74syn keyword cobolReserved contained RELATIVE RELEASE REMAINDER REMOVAL REPLACE REPLACING REPORT REPORTING
75syn keyword cobolReserved contained REPORTS RERUN RESERVE RESET RETURN RETURNING REVERSED REWIND REWRITE RF RH
76syn keyword cobolReserved contained RIGHT ROUNDED RUN SAME SD SEARCH SECTION SECURITY SEGMENT SEGMENT-LIMITED
77syn keyword cobolReserved contained SELECT SEND SENTENCE SEPARATE SEQUENCE SEQUENTIAL SET SIGN SIZE SORT
78syn keyword cobolReserved contained SORT-MERGE SOURCE STANDARD
79syn keyword cobolReserved contained STANDARD-1 STANDARD-2 START STATUS STOP STRING SUB-QUEUE-1 SUB-QUEUE-2
80syn keyword cobolReserved contained SUB-QUEUE-3 SUBTRACT SUM SUPPRESS SYMBOLIC SYNC SYNCHRONIZED TABLE TALLYING
81syn keyword cobolReserved contained TAPE TERMINAL TERMINATE TEST TEXT THAN THEN THROUGH THRU TIME TIMES TO TOP
82syn keyword cobolReserved contained TRAILING TRUE TYPE UNIT UNSTRING UNTIL UP UPON USAGE USE USING VALUE VALUES
83syn keyword cobolReserved contained VARYING WHEN WITH WORDS WRITE
84syn match   cobolReserved contained "\<CONTAINS\>"
85syn match   cobolReserved contained "\<\(IF\|INVALID\|END\|EOP\)\>"
86syn match   cobolReserved contained "\<ALL\>"
87
88syn cluster cobolLine     add=cobolConstant,cobolNumber,cobolPic
89syn keyword cobolConstant SPACE SPACES NULL ZERO ZEROES ZEROS LOW-VALUE LOW-VALUES
90
91syn match   cobolNumber       "\<-\=\d*\.\=\d\+\>" contained
92syn match   cobolPic		"\<S*9\+\>" contained
93syn match   cobolPic		"\<$*\.\=9\+\>" contained
94syn match   cobolPic		"\<Z*\.\=9\+\>" contained
95syn match   cobolPic		"\<V9\+\>" contained
96syn match   cobolPic		"\<9\+V\>" contained
97syn match   cobolPic		"\<-\+[Z9]\+\>" contained
98syn match   cobolTodo		"todo" contained containedin=cobolComment
99
100" For MicroFocus or other inline comments, include this line.
101" syn region  cobolComment      start="*>" end="$" contains=cobolTodo,cobolMarker
102
103syn match   cobolBadLine      "[^ D\*$/-].*" contained
104" If comment mark somehow gets into column past Column 7.
105syn match   cobolBadLine      "\s\+\*.*" contained
106syn cluster cobolStart        add=cobolBadLine
107
108
109syn keyword cobolGoTo		GO GOTO
110syn keyword cobolCopy		COPY
111
112" cobolBAD: things that are BAD NEWS!
113syn keyword cobolBAD		ALTER ENTER RENAMES
114
115syn cluster cobolLine       add=cobolGoTo,cobolCopy,cobolBAD,cobolWatch,cobolEXECs
116
117" cobolWatch: things that are important when trying to understand a program
118syn keyword cobolWatch		OCCURS DEPENDING VARYING BINARY COMP REDEFINES
119syn keyword cobolWatch		REPLACING RUN
120syn match   cobolWatch		"COMP-[123456XN]"
121
122syn keyword cobolEXECs		EXEC END-EXEC
123
124
125syn cluster cobolAreaA      add=cobolDeclA
126syn cluster cobolAreaAB     add=cobolDecl
127syn match   cobolDeclA      "\(0\=1\|77\|78\) " contained nextgroup=cobolLine
128syn match   cobolDecl		"[1-4]\d " contained nextgroup=cobolLine
129syn match   cobolDecl		"0\=[2-9] " contained nextgroup=cobolLine
130syn match   cobolDecl		"66 " contained nextgroup=cobolLine
131
132syn match   cobolWatch		"88 " contained nextgroup=cobolLine
133
134"syn match   cobolBadID		"\k\+-\($\|[^-A-Z0-9]\)" contained
135
136syn cluster cobolLine       add=cobolCALLs,cobolString,cobolCondFlow
137syn keyword cobolCALLs		CALL END-CALL CANCEL GOBACK PERFORM END-PERFORM INVOKE
138syn match   cobolCALLs		"EXIT \+PROGRAM"
139syn match   cobolExtras       /\<VALUE \+\d\+\./hs=s+6,he=e-1
140
141syn match   cobolString       /"[^"]*\("\|$\)/
142syn match   cobolString       /'[^']*\('\|$\)/
143
144"syn region  cobolLine        start="^.\{6}[ D-]" end="$" contains=ALL
145syn match   cobolIndicator   "\%7c[D-]" contained
146
147if exists("cobol_legacy_code")
148  syn region  cobolCondFlow     contains=ALLBUT,cobolLine start="\<\(IF\|INVALID\|END\|EOP\)\>" skip=/\('\|"\)[^"]\{-}\("\|'\|$\)/ end="\." keepend
149endif
150
151" many legacy sources have junk in columns 1-6: must be before others
152" Stuff after column 72 is in error - must be after all other "match" entries
153if exists("cobol_legacy_code")
154    syn match   cobolBadLine      "\%73c.*" containedin=ALLBUT,cobolComment
155else
156    syn match   cobolBadLine      "\%73c.*" containedin=ALL
157endif
158
159" Define the default highlighting.
160" For version 5.7 and earlier: only when not done already
161" For version 5.8 and later: only when an item doesn't have highlighting yet
162if version >= 508 || !exists("did_cobol_syntax_inits")
163  if version < 508
164    let did_cobol_syntax_inits = 1
165    command -nargs=+ HiLink hi link <args>
166  else
167    command -nargs=+ HiLink hi def link <args>
168  endif
169
170  HiLink cobolBAD      Error
171  HiLink cobolBadID    Error
172  HiLink cobolBadLine  Error
173  if exists("g:cobol_legacy_code")
174      HiLink cobolMarker   Comment
175  else
176      HiLink cobolMarker   Error
177  endif
178  HiLink cobolCALLs    Function
179  HiLink cobolComment  Comment
180  HiLink cobolKeys     Comment
181  HiLink cobolAreaB    Special
182  HiLink cobolCompiler PreProc
183  HiLink cobolCondFlow Special
184  HiLink cobolCopy     PreProc
185  HiLink cobolDeclA    cobolDecl
186  HiLink cobolDecl     Type
187  HiLink cobolExtras   Special
188  HiLink cobolGoTo     Special
189  HiLink cobolConstant Constant
190  HiLink cobolNumber   Constant
191  HiLink cobolPic      Constant
192  HiLink cobolReserved Statement
193  HiLink cobolDivision Label
194  HiLink cobolSection  Label
195  HiLink cobolParagraph Label
196  HiLink cobolDivisionName  Keyword
197  HiLink cobolSectionName   Keyword
198  HiLink cobolParagraphName Keyword
199  HiLink cobolString   Constant
200  HiLink cobolTodo     Todo
201  HiLink cobolWatch    Special
202  HiLink cobolIndicator Special
203
204  delcommand HiLink
205endif
206
207let b:current_syntax = "cobol"
208
209" vim: ts=6 nowrap
210