blob: 9e0b307d682519659f0936e53762e7809d9020fc [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: Lex
Bram Moolenaar1d9215b2020-01-25 13:27:42 +01003" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
Bram Moolenaarf37506f2016-08-31 22:22:10 +02004" Last Change: Aug 31, 2016
Bram Moolenaar1d9215b2020-01-25 13:27:42 +01005" Version: 17
Bram Moolenaarf37506f2016-08-31 22:22:10 +02006" URL: http://mysite.verizon.net/astronaut/vim/index.html#SYNTAX_LEX
Bram Moolenaar071d4272004-06-13 20:20:40 +00007"
8" Option:
9" lex_uses_cpp : if this variable exists, then C++ is loaded rather than C
10
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020011" quit when a syntax file was already loaded
12if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000013 finish
14endif
15
Bram Moolenaar5c736222010-01-06 20:54:52 +010016" Read the C/C++ syntax to start with
Bram Moolenaar97d62492012-11-15 21:28:22 +010017let s:Cpath= fnameescape(expand("<sfile>:p:h").(exists("g:lex_uses_cpp")? "/cpp.vim" : "/c.vim"))
18if !filereadable(s:Cpath)
19 for s:Cpath in split(globpath(&rtp,(exists("g:lex_uses_cpp")? "syntax/cpp.vim" : "syntax/c.vim")),"\n")
20 if filereadable(fnameescape(s:Cpath))
21 let s:Cpath= fnameescape(s:Cpath)
22 break
Bram Moolenaar071d4272004-06-13 20:20:40 +000023 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010024 endfor
Bram Moolenaar071d4272004-06-13 20:20:40 +000025endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010026exe "syn include @lexCcode ".s:Cpath
Bram Moolenaar071d4272004-06-13 20:20:40 +000027
Bram Moolenaard4755bb2004-09-02 19:12:26 +000028" --- ========= ---
Bram Moolenaar071d4272004-06-13 20:20:40 +000029" --- Lex stuff ---
Bram Moolenaard4755bb2004-09-02 19:12:26 +000030" --- ========= ---
Bram Moolenaar071d4272004-06-13 20:20:40 +000031
Bram Moolenaar81af9252010-12-10 20:35:50 +010032" Options Section
33syn match lexOptions '^%\s*option\>.*$' contains=lexPatString
34
Bram Moolenaar071d4272004-06-13 20:20:40 +000035" Abbreviations Section
Bram Moolenaar5c736222010-01-06 20:54:52 +010036if has("folding")
37 syn region lexAbbrvBlock fold start="^\(\h\+\s\|%{\)" end="^\ze%%$" skipnl nextgroup=lexPatBlock contains=lexAbbrv,lexInclude,lexAbbrvComment,lexStartState
38else
39 syn region lexAbbrvBlock start="^\(\h\+\s\|%{\)" end="^\ze%%$" skipnl nextgroup=lexPatBlock contains=lexAbbrv,lexInclude,lexAbbrvComment,lexStartState
40endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000041syn match lexAbbrv "^\I\i*\s"me=e-1 skipwhite contained nextgroup=lexAbbrvRegExp
42syn match lexAbbrv "^%[sx]" contained
43syn match lexAbbrvRegExp "\s\S.*$"lc=1 contained nextgroup=lexAbbrv,lexInclude
Bram Moolenaar5c736222010-01-06 20:54:52 +010044if has("folding")
Bram Moolenaar97d62492012-11-15 21:28:22 +010045 syn region lexInclude fold matchgroup=lexSep start="^%{" end="%}" contained contains=@lexCcode
Bram Moolenaar5c736222010-01-06 20:54:52 +010046 syn region lexAbbrvComment fold start="^\s\+/\*" end="\*/" contains=@Spell
Bram Moolenaar97d62492012-11-15 21:28:22 +010047 syn region lexAbbrvComment fold start="\%^/\*" end="\*/" contains=@Spell
Bram Moolenaar5c736222010-01-06 20:54:52 +010048 syn region lexStartState fold matchgroup=lexAbbrv start="^%\a\+" end="$" contained
49else
Bram Moolenaar97d62492012-11-15 21:28:22 +010050 syn region lexInclude matchgroup=lexSep start="^%{" end="%}" contained contains=@lexCcode
Bram Moolenaar5c736222010-01-06 20:54:52 +010051 syn region lexAbbrvComment start="^\s\+/\*" end="\*/" contains=@Spell
Bram Moolenaar97d62492012-11-15 21:28:22 +010052 syn region lexAbbrvComment start="\%^/\*" end="\*/" contains=@Spell
Bram Moolenaar5c736222010-01-06 20:54:52 +010053 syn region lexStartState matchgroup=lexAbbrv start="^%\a\+" end="$" contained
54endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000055
56"%% : Patterns {Actions}
Bram Moolenaar5c736222010-01-06 20:54:52 +010057if has("folding")
Bram Moolenaar97d62492012-11-15 21:28:22 +010058 syn region lexPatBlock fold matchgroup=Todo start="^%%$" matchgroup=Todo end="^%\ze%$" skipnl skipwhite nextgroup=lexFinalCodeBlock contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatInclude
59 syn region lexPat fold start=+\S+ skip="\\\\\|\\." end="\s"me=e-1 skipwhite contained nextgroup=lexMorePat,lexPatSep,lexPattern contains=lexPatTag,lexPatString,lexSlashQuote,lexBrace
Bram Moolenaar81af9252010-12-10 20:35:50 +010060 syn region lexPatInclude fold matchgroup=lexSep start="^%{" end="%}" contained contains=lexPatCode
Bram Moolenaar5c736222010-01-06 20:54:52 +010061 syn region lexBrace fold start="\[" skip=+\\\\\|\\+ end="]" contained
62 syn region lexPatString fold matchgroup=String start=+"+ skip=+\\\\\|\\"+ matchgroup=String end=+"+ contained
63else
Bram Moolenaar97d62492012-11-15 21:28:22 +010064 syn region lexPatBlock matchgroup=Todo start="^%%$" matchgroup=Todo end="^%%$" skipnl skipwhite nextgroup=lexFinalCodeBlock contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatInclude
65 syn region lexPat start=+\S+ skip="\\\\\|\\." end="\s"me=e-1 skipwhite contained nextgroup=lexMorePat,lexPatSep,lexPattern contains=lexPatTag,lexPatString,lexSlashQuote,lexBrace
Bram Moolenaar81af9252010-12-10 20:35:50 +010066 syn region lexPatInclude matchgroup=lexSep start="^%{" end="%}" contained contains=lexPatCode
Bram Moolenaar5c736222010-01-06 20:54:52 +010067 syn region lexBrace start="\[" skip=+\\\\\|\\+ end="]" contained
68 syn region lexPatString matchgroup=String start=+"+ skip=+\\\\\|\\"+ matchgroup=String end=+"+ contained
69endif
70syn match lexPatTag "^<\I\i*\(,\I\i*\)*>" contained nextgroup=lexPat,lexPatTag,lexMorePat,lexPatSep
Bram Moolenaar97d62492012-11-15 21:28:22 +010071syn match lexPatTagZone "^<\I\i*\(,\I\i*\)*>\s\+\ze{" contained nextgroup=lexPatTagZoneStart
Bram Moolenaar071d4272004-06-13 20:20:40 +000072syn match lexPatTag +^<\I\i*\(,\I\i*\)*>*\(\\\\\)*\\"+ contained nextgroup=lexPat,lexPatTag,lexMorePat,lexPatSep
Bram Moolenaar97d62492012-11-15 21:28:22 +010073
74" Lex Patterns
75syn region lexPattern start='[^ \t{}]' end="$" contained contains=lexPatRange
76syn region lexPatRange matchgroup=Delimiter start='\[' skip='\\\\\|\\.' end='\]' contains=lexEscape
77syn match lexEscape '\%(\\\\\)*\\.' contained
78
Bram Moolenaar5c736222010-01-06 20:54:52 +010079if has("folding")
Bram Moolenaar97d62492012-11-15 21:28:22 +010080 syn region lexPatTagZoneStart matchgroup=lexPatTag fold start='{' end='}' contained contains=lexPat,lexPatComment
Bram Moolenaar5c736222010-01-06 20:54:52 +010081 syn region lexPatComment start="\s\+/\*" end="\*/" fold skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
82else
Bram Moolenaar97d62492012-11-15 21:28:22 +010083 syn region lexPatTagZoneStart matchgroup=lexPatTag start='{' end='}' contained contains=lexPat,lexPatComment
Bram Moolenaar5c736222010-01-06 20:54:52 +010084 syn region lexPatComment start="\s\+/\*" end="\*/" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
85endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010086syn match lexPatCodeLine "[^{\[].*" contained contains=@lexCcode
Bram Moolenaar071d4272004-06-13 20:20:40 +000087syn match lexMorePat "\s*|\s*$" skipnl contained nextgroup=lexPat,lexPatTag,lexPatComment
88syn match lexPatSep "\s\+" contained nextgroup=lexMorePat,lexPatCode,lexPatCodeLine
89syn match lexSlashQuote +\(\\\\\)*\\"+ contained
Bram Moolenaar5c736222010-01-06 20:54:52 +010090if has("folding")
Bram Moolenaar97d62492012-11-15 21:28:22 +010091 syn region lexPatCode matchgroup=Delimiter start="{" end="}" fold skipnl contained contains=@lexCcode,lexCFunctions
Bram Moolenaar5c736222010-01-06 20:54:52 +010092else
Bram Moolenaar97d62492012-11-15 21:28:22 +010093 syn region lexPatCode matchgroup=Delimiter start="{" end="}" skipnl contained contains=@lexCcode,lexCFunctions
Bram Moolenaar5c736222010-01-06 20:54:52 +010094endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000095
Bram Moolenaar97d62492012-11-15 21:28:22 +010096" Lex "functions" which may appear in C/C++ code blocks
Bram Moolenaar071d4272004-06-13 20:20:40 +000097syn keyword lexCFunctions BEGIN input unput woutput yyleng yylook yytext
98syn keyword lexCFunctions ECHO output winput wunput yyless yymore yywrap
99
Bram Moolenaar97d62492012-11-15 21:28:22 +0100100" %%
101" lexAbbrevBlock
102" %%
103" lexPatBlock
104" %%
105" lexFinalCodeBlock
106syn region lexFinalCodeBlock matchgroup=Todo start="%$"me=e-1 end="\%$" contained contains=@lexCcode
107
Bram Moolenaar071d4272004-06-13 20:20:40 +0000108" <c.vim> includes several ALLBUTs; these have to be treated so as to exclude lex* groups
109syn cluster cParenGroup add=lex.*
110syn cluster cDefineGroup add=lex.*
111syn cluster cPreProcGroup add=lex.*
112syn cluster cMultiGroup add=lex.*
113
114" Synchronization
115syn sync clear
Bram Moolenaar97d62492012-11-15 21:28:22 +0100116syn sync minlines=500
Bram Moolenaar071d4272004-06-13 20:20:40 +0000117syn sync match lexSyncPat grouphere lexPatBlock "^%[a-zA-Z]"
118syn sync match lexSyncPat groupthere lexPatBlock "^<$"
119syn sync match lexSyncPat groupthere lexPatBlock "^%%$"
120
121" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200122if !exists("skip_lex_syntax_inits")
123 hi def link lexAbbrvComment lexPatComment
124 hi def link lexAbbrvRegExp Macro
125 hi def link lexAbbrv SpecialChar
126 hi def link lexBrace lexPat
127 hi def link lexCFunctions Function
128 hi def link lexCstruct cStructure
129 hi def link lexMorePat SpecialChar
130 hi def link lexOptions PreProc
131 hi def link lexPatComment Comment
132 hi def link lexPat Function
133 hi def link lexPatString Function
134 hi def link lexPatTag Special
135 hi def link lexPatTagZone lexPatTag
136 hi def link lexSep Delimiter
137 hi def link lexSlashQuote lexPat
138 hi def link lexStartState Statement
139endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000140
141let b:current_syntax = "lex"
142
143" vim:ts=10