1" Vim syntax file
2" Language:	Lex
3" Maintainer:	Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz>
4" Last Change:	Sep 11, 2009
5" Version:	10
6" URL:	http://mysite.verizon.net/astronaut/vim/index.html#vimlinks_syntax
7"
8" Option:
9"   lex_uses_cpp : if this variable exists, then C++ is loaded rather than C
10
11" For version 5.x: Clear all syntax items
12" For version 6.x: Quit when a syntax file was already loaded
13if version < 600
14  syntax clear
15elseif exists("b:current_syntax")
16  finish
17endif
18
19" Read the C/C++ syntax to start with
20if version >= 600
21  if exists("lex_uses_cpp")
22    runtime! syntax/cpp.vim
23  else
24    runtime! syntax/c.vim
25  endif
26  unlet b:current_syntax
27else
28  if exists("lex_uses_cpp")
29    so <sfile>:p:h/cpp.vim
30  else
31    so <sfile>:p:h/c.vim
32  endif
33endif
34
35" --- ========= ---
36" --- Lex stuff ---
37" --- ========= ---
38
39"I'd prefer to use lex.* , but vim doesn't handle forward definitions yet
40syn cluster lexListGroup		contains=lexAbbrvBlock,lexAbbrv,lexAbbrv,lexAbbrvRegExp,lexInclude,lexPatBlock,lexPat,lexBrace,lexPatString,lexPatTag,lexPatTag,lexPatComment,lexPatCodeLine,lexMorePat,lexPatSep,lexSlashQuote,lexPatCode,cInParen,cUserLabel,cOctalZero,cCppSkip,cErrInBracket,cErrInParen,cOctalError,cCppOut2,cCommentStartError,cParenError
41syn cluster lexListPatCodeGroup	contains=lexAbbrvBlock,lexAbbrv,lexAbbrv,lexAbbrvRegExp,lexInclude,lexPatBlock,lexPat,lexBrace,lexPatTag,lexPatTag,lexPatTagZoneStart,lexPatComment,lexPatCodeLine,lexMorePat,lexPatSep,lexSlashQuote,cInParen,cUserLabel,cOctalZero,cCppSkip,cErrInBracket,cErrInParen,cOctalError,cCppOut2,cCommentStartError,cParenError
42
43" Abbreviations Section
44if has("folding")
45 syn region lexAbbrvBlock	fold start="^\(\h\+\s\|%{\)"	end="^\ze%%$"	skipnl	nextgroup=lexPatBlock contains=lexAbbrv,lexInclude,lexAbbrvComment,lexStartState
46else
47 syn region lexAbbrvBlock	start="^\(\h\+\s\|%{\)"	end="^\ze%%$"	skipnl	nextgroup=lexPatBlock contains=lexAbbrv,lexInclude,lexAbbrvComment,lexStartState
48endif
49syn match  lexAbbrv		"^\I\i*\s"me=e-1			skipwhite	contained nextgroup=lexAbbrvRegExp
50syn match  lexAbbrv		"^%[sx]"					contained
51syn match  lexAbbrvRegExp	"\s\S.*$"lc=1				contained nextgroup=lexAbbrv,lexInclude
52if has("folding")
53 syn region lexInclude	fold matchgroup=lexSep	start="^%{"	end="%}"	contained	contains=ALLBUT,@lexListGroup
54 syn region lexAbbrvComment	fold			start="^\s\+/\*"	end="\*/"	contains=@Spell
55 syn region lexStartState	fold matchgroup=lexAbbrv	start="^%\a\+"	end="$"	contained
56else
57 syn region lexInclude	matchgroup=lexSep		start="^%{"	end="%}"	contained	contains=ALLBUT,@lexListGroup
58 syn region lexAbbrvComment				start="^\s\+/\*"	end="\*/"	contains=@Spell
59 syn region lexStartState	matchgroup=lexAbbrv		start="^%\a\+"	end="$"	contained
60endif
61
62"%% : Patterns {Actions}
63if has("folding")
64 syn region lexPatBlock	fold matchgroup=Todo	start="^%%$" matchgroup=Todo	end="^%%$"	skipnl skipwhite	contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat
65 syn region lexPat		fold			start=+\S+ skip="\\\\\|\\."	end="\s"me=e-1		contained nextgroup=lexMorePat,lexPatSep contains=lexPatTag,lexPatString,lexSlashQuote,lexBrace
66 syn region lexBrace	fold			start="\[" skip=+\\\\\|\\+	end="]"			contained
67 syn region lexPatString	fold matchgroup=String	start=+"+	skip=+\\\\\|\\"+	matchgroup=String end=+"+	contained
68else
69 syn region lexPatBlock	matchgroup=Todo		start="^%%$" matchgroup=Todo	end="^%%$"	skipnl skipwhite	contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat
70 syn region lexPat					start=+\S+ skip="\\\\\|\\."	end="\s"me=e-1		contained nextgroup=lexMorePat,lexPatSep contains=lexPatTag,lexPatString,lexSlashQuote,lexBrace
71 syn region lexBrace				start="\[" skip=+\\\\\|\\+	end="]"			contained
72 syn region lexPatString	matchgroup=String		start=+"+	skip=+\\\\\|\\"+	matchgroup=String end=+"+	contained
73endif
74syn match  lexPatTag	"^<\I\i*\(,\I\i*\)*>"			contained nextgroup=lexPat,lexPatTag,lexMorePat,lexPatSep
75syn match  lexPatTagZone	"^<\I\i*\(,\I\i*\)*>\s*\ze{"		contained nextgroup=lexPatTagZoneStart
76syn match  lexPatTag	+^<\I\i*\(,\I\i*\)*>*\(\\\\\)*\\"+		contained nextgroup=lexPat,lexPatTag,lexMorePat,lexPatSep
77if has("folding")
78 syn region  lexPatTagZoneStart matchgroup=lexPatTag	fold	start='{' end='}'	contained contains=lexPat,lexPatComment
79 syn region lexPatComment	start="\s\+/\*" end="\*/"	fold	skipnl	contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
80else
81 syn region  lexPatTagZoneStart matchgroup=lexPatTag		start='{' end='}'	contained contains=lexPat,lexPatComment
82 syn region lexPatComment	start="\s\+/\*" end="\*/"		skipnl	contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
83endif
84syn match  lexPatCodeLine	".*$"					contained contains=ALLBUT,@lexListGroup
85syn match  lexMorePat	"\s*|\s*$"			skipnl	contained nextgroup=lexPat,lexPatTag,lexPatComment
86syn match  lexPatSep	"\s\+"					contained nextgroup=lexMorePat,lexPatCode,lexPatCodeLine
87syn match  lexSlashQuote	+\(\\\\\)*\\"+				contained
88if has("folding")
89 syn region lexPatCode matchgroup=Delimiter start="{" end="}"	fold	skipnl contained contains=ALLBUT,@lexListPatCodeGroup
90else
91 syn region lexPatCode matchgroup=Delimiter start="{" end="}"		skipnl contained contains=ALLBUT,@lexListPatCodeGroup
92endif
93
94syn keyword lexCFunctions	BEGIN	input	unput	woutput	yyleng	yylook	yytext
95syn keyword lexCFunctions	ECHO	output	winput	wunput	yyless	yymore	yywrap
96
97" <c.vim> includes several ALLBUTs; these have to be treated so as to exclude lex* groups
98syn cluster cParenGroup	add=lex.*
99syn cluster cDefineGroup	add=lex.*
100syn cluster cPreProcGroup	add=lex.*
101syn cluster cMultiGroup	add=lex.*
102
103" Synchronization
104syn sync clear
105syn sync minlines=300
106syn sync match lexSyncPat	grouphere  lexPatBlock	"^%[a-zA-Z]"
107syn sync match lexSyncPat	groupthere lexPatBlock	"^<$"
108syn sync match lexSyncPat	groupthere lexPatBlock	"^%%$"
109
110" The default highlighting.
111hi def link lexAbbrvComment	lexPatComment
112hi def link lexBrace	lexPat
113hi def link lexPatTagZone	lexPatTag
114hi def link lexSlashQuote	lexPat
115
116hi def link lexAbbrvRegExp	Macro
117hi def link lexAbbrv	SpecialChar
118hi def link lexCFunctions	Function
119hi def link lexMorePat	SpecialChar
120hi def link lexPatComment	Comment
121hi def link lexPat		Function
122hi def link lexPatString	Function
123hi def link lexPatTag	Special
124hi def link lexSep		Delimiter
125hi def link lexStartState	Statement
126
127let b:current_syntax = "lex"
128
129" vim:ts=10
130