1" Vim syntax file
2" Language:	awk, nawk, gawk, mawk
3" Maintainer:	Antonio Colombo <azc10@yahoo.com>
4" Last Change:	2005 Mar 16
5
6" AWK  ref.  is: Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger
7" The AWK Programming Language, Addison-Wesley, 1988
8
9" GAWK ref. is: Arnold D. Robbins
10" Effective AWK Programming, Third Edition, O'Reilly, 2001
11
12" MAWK is a "new awk" meaning it implements AWK ref.
13" mawk conforms to the Posix 1003.2 (draft 11.3)
14" definition of the AWK language which contains a few features
15" not described in the AWK book, and mawk provides a small number of extensions.
16
17" TODO:
18" Dig into the commented out syntax expressions below.
19
20" For version 5.x: Clear all syntax items
21" For version 6.x: Quit when a syntax file was already loaded
22if version < 600
23  syn clear
24elseif exists("b:current_syntax")
25  finish
26endif
27
28" A bunch of useful Awk keywords
29" AWK  ref. p. 188
30syn keyword awkStatement	break continue delete exit
31syn keyword awkStatement	function getline next
32syn keyword awkStatement	print printf return
33" GAWK ref. p. 117
34syn keyword awkStatement	nextfile
35" AWK  ref. p. 42, GAWK ref. p. 142-166
36syn keyword awkFunction	atan2 close cos exp fflush int log rand sin sqrt srand
37syn keyword awkFunction	gsub index length match split sprintf sub
38syn keyword awkFunction	substr system
39" GAWK ref. p. 142-166
40syn keyword awkFunction	asort gensub mktime strftime strtonum systime
41syn keyword awkFunction	tolower toupper
42syn keyword awkFunction	and or xor compl lshift rshift
43syn keyword awkFunction	dcgettext bindtextdomain
44
45syn keyword awkConditional	if else
46syn keyword awkRepeat	while for
47
48syn keyword awkTodo		contained TODO
49
50syn keyword awkPatterns	BEGIN END
51" AWK  ref. p. 36
52syn keyword awkVariables	ARGC ARGV FILENAME FNR FS NF NR
53syn keyword awkVariables	OFMT OFS ORS RLENGTH RS RSTART SUBSEP
54" GAWK ref. p. 120-126
55syn keyword awkVariables	ARGIND BINMODE CONVFMT ENVIRON ERRNO
56syn keyword awkVariables	FIELDWIDTHS IGNORECASE LINT PROCINFO
57syn keyword awkVariables	RT RLENGTH TEXTDOMAIN
58
59syn keyword awkRepeat	do
60
61" Octal format character.
62syn match   awkSpecialCharacter display contained "\\[0-7]\{1,3\}"
63syn keyword awkStatement	func nextfile
64" Hex   format character.
65syn match   awkSpecialCharacter display contained "\\x[0-9A-Fa-f]\+"
66
67syn match   awkFieldVars	"\$\d\+"
68
69"catch errors caused by wrong parenthesis
70syn region	awkParen	transparent start="(" end=")" contains=ALLBUT,awkParenError,awkSpecialCharacter,awkArrayElement,awkArrayArray,awkTodo,awkRegExp,awkBrktRegExp,awkBrackets,awkCharClass
71syn match	awkParenError	display ")"
72syn match	awkInParen	display contained "[{}]"
73
74" 64 lines for complex &&'s, and ||'s in a big "if"
75syn sync ccomment awkParen maxlines=64
76
77" Search strings & Regular Expressions therein.
78syn region  awkSearch	oneline start="^[ \t]*/"ms=e start="\(,\|!\=\~\)[ \t]*/"ms=e skip="\\\\\|\\/" end="/" contains=awkBrackets,awkRegExp,awkSpecialCharacter
79syn region  awkBrackets	contained start="\[\^\]\="ms=s+2 start="\[[^\^]"ms=s+1 end="\]"me=e-1 contains=awkBrktRegExp,awkCharClass
80syn region  awkSearch	oneline start="[ \t]*/"hs=e skip="\\\\\|\\/" end="/" contains=awkBrackets,awkRegExp,awkSpecialCharacter
81
82syn match   awkCharClass	contained "\[:[^:\]]*:\]"
83syn match   awkBrktRegExp	contained "\\.\|.\-[^]]"
84syn match   awkRegExp	contained "/\^"ms=s+1
85syn match   awkRegExp	contained "\$/"me=e-1
86syn match   awkRegExp	contained "[?.*{}|+]"
87
88" String and Character constants
89" Highlight special characters (those which have a backslash) differently
90syn region  awkString	start=+"+  skip=+\\\\\|\\"+  end=+"+  contains=awkSpecialCharacter,awkSpecialPrintf
91syn match   awkSpecialCharacter contained "\\."
92
93" Some of these combinations may seem weird, but they work.
94syn match   awkSpecialPrintf	contained "%[-+ #]*\d*\.\=\d*[cdefgiosuxEGX%]"
95
96" Numbers, allowing signs (both -, and +)
97" Integer number.
98syn match  awkNumber		display "[+-]\=\<\d\+\>"
99" Floating point number.
100syn match  awkFloat		display "[+-]\=\<\d\+\.\d+\>"
101" Floating point number, starting with a dot.
102syn match  awkFloat		display "[+-]\=\<.\d+\>"
103syn case ignore
104"floating point number, with dot, optional exponent
105syn match  awkFloat	display "\<\d\+\.\d*\(e[-+]\=\d\+\)\=\>"
106"floating point number, starting with a dot, optional exponent
107syn match  awkFloat	display "\.\d\+\(e[-+]\=\d\+\)\=\>"
108"floating point number, without dot, with exponent
109syn match  awkFloat	display "\<\d\+e[-+]\=\d\+\>"
110syn case match
111
112"syn match  awkIdentifier	"\<[a-zA-Z_][a-zA-Z0-9_]*\>"
113
114" Arithmetic operators: +, and - take care of ++, and --
115"syn match   awkOperator	"+\|-\|\*\|/\|%\|="
116"syn match   awkOperator	"+=\|-=\|\*=\|/=\|%="
117"syn match   awkOperator	"^\|^="
118
119" Comparison expressions.
120"syn match   awkExpression	"==\|>=\|=>\|<=\|=<\|\!="
121"syn match   awkExpression	"\~\|\!\~"
122"syn match   awkExpression	"?\|:"
123"syn keyword awkExpression	in
124
125" Boolean Logic (OR, AND, NOT)
126"syn match  awkBoolLogic	"||\|&&\|\!"
127
128" This is overridden by less-than & greater-than.
129" Put this above those to override them.
130" Put this in a 'match "\<printf\=\>.*;\="' to make it not override
131" less/greater than (most of the time), but it won't work yet because
132" keywords allways have precedence over match & region.
133" File I/O: (print foo, bar > "filename") & for nawk (getline < "filename")
134"syn match  awkFileIO		contained ">"
135"syn match  awkFileIO		contained "<"
136
137" Expression separators: ';' and ','
138syn match  awkSemicolon	";"
139syn match  awkComma		","
140
141syn match  awkComment	"#.*" contains=awkTodo
142
143syn match  awkLineSkip	"\\$"
144
145" Highlight array element's (recursive arrays allowed).
146" Keeps nested array names' separate from normal array elements.
147" Keeps numbers separate from normal array elements (variables).
148syn match  awkArrayArray	contained "[^][, \t]\+\["me=e-1
149syn match  awkArrayElement      contained "[^][, \t]\+"
150syn region awkArray		transparent start="\[" end="\]" contains=awkArray,awkArrayElement,awkArrayArray,awkNumber,awkFloat
151
152" 10 should be enough.
153" (for the few instances where it would be more than "oneline")
154syn sync ccomment awkArray maxlines=10
155
156" define the default highlighting
157" For version 5.7 and earlier: only when not done already
158" For version 5.8 and later: only when an item doesn't have highlightling yet
159if version >= 508 || !exists("did_awk_syn_inits")
160  if version < 508
161    let did_awk_syn_inits = 1
162    command -nargs=+ HiLink hi link <args>
163  else
164    command -nargs=+ HiLink hi def link <args>
165  endif
166
167  HiLink awkConditional		Conditional
168  HiLink awkFunction		Function
169  HiLink awkRepeat		Repeat
170  HiLink awkStatement		Statement
171
172  HiLink awkString		String
173  HiLink awkSpecialPrintf	Special
174  HiLink awkSpecialCharacter	Special
175
176  HiLink awkSearch		String
177  HiLink awkBrackets		awkRegExp
178  HiLink awkBrktRegExp		awkNestRegExp
179  HiLink awkCharClass		awkNestRegExp
180  HiLink awkNestRegExp		Keyword
181  HiLink awkRegExp		Special
182
183  HiLink awkNumber		Number
184  HiLink awkFloat		Float
185
186  HiLink awkFileIO		Special
187  "HiLink awkOperator		Special
188  "HiLink awkExpression		Special
189  HiLink awkBoolLogic		Special
190
191  HiLink awkPatterns		Special
192  HiLink awkVariables		Special
193  HiLink awkFieldVars		Special
194
195  HiLink awkLineSkip		Special
196  HiLink awkSemicolon		Special
197  HiLink awkComma		Special
198  "HiLink awkIdentifier		Identifier
199
200  HiLink awkComment		Comment
201  HiLink awkTodo		Todo
202
203  " Change this if you want nested array names to be highlighted.
204  HiLink awkArrayArray		awkArray
205  HiLink awkArrayElement	Special
206
207  HiLink awkParenError		awkError
208  HiLink awkInParen		awkError
209  HiLink awkError		Error
210
211  delcommand HiLink
212endif
213
214let b:current_syntax = "awk"
215
216" vim: ts=8
217