blob: b05148e88fdaab3482593d08b6494b01a041b299 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar7ceefb32020-05-01 16:07:38 +02002" Language: Lex and Flex
Christian Brabandtf9ca1392024-02-19 20:37:11 +01003" Maintainer: This runtime file is looking for a new maintainer.
4" Former Maintainer: Charles E. Campbell
Bram Moolenaar7ceefb32020-05-01 16:07:38 +02005" Contributor: Robert A. van Engelen <engelen@acm.org>
Bram Moolenaar7ceefb32020-05-01 16:07:38 +02006" Version: 18
Christian Brabandtf9ca1392024-02-19 20:37:11 +01007" Last Change: Apr 24, 2020
8" 2024 Feb 19 by Vim Project (announce adoption)
Bram Moolenaar071d4272004-06-13 20:20:40 +00009
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020010" quit when a syntax file was already loaded
11if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000012 finish
13endif
14
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020015" Read the C++ syntax to start with
16let s:Cpath= fnameescape(expand("<sfile>:p:h")."/cpp.vim")
Bram Moolenaar97d62492012-11-15 21:28:22 +010017if !filereadable(s:Cpath)
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020018 for s:Cpath in split(globpath(&rtp,"syntax/cpp.vim"),"\n")
Bram Moolenaar97d62492012-11-15 21:28:22 +010019 if filereadable(fnameescape(s:Cpath))
20 let s:Cpath= fnameescape(s:Cpath)
21 break
Bram Moolenaar071d4272004-06-13 20:20:40 +000022 endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010023 endfor
Bram Moolenaar071d4272004-06-13 20:20:40 +000024endif
Bram Moolenaar97d62492012-11-15 21:28:22 +010025exe "syn include @lexCcode ".s:Cpath
Bram Moolenaar071d4272004-06-13 20:20:40 +000026
Bram Moolenaard4755bb2004-09-02 19:12:26 +000027" --- ========= ---
Bram Moolenaar071d4272004-06-13 20:20:40 +000028" --- Lex stuff ---
Bram Moolenaard4755bb2004-09-02 19:12:26 +000029" --- ========= ---
Bram Moolenaar071d4272004-06-13 20:20:40 +000030
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020031" Definitions
32" %%
33" Rules
34" %%
35" User Code
36"
37" --- ======= ---
38" --- Example ---
39" --- ======= ---
40"
41" // this is a valid lex file
42" // indented initial code block
43" #include <stdlib.h>
44" %{
45" // initial code block
46" #include <stdio.h>
47" const char *sep = "";
48" %}
49" %option outfile="scanner.c" noyywrap nodefault
50" %x COMMENT
51" id [A-Za-z_][A-Za-z0-9_]*
52" %%
53" // indented initial action code block
54" printf("BEGIN");
55" {id} printf("%s%s", sep, yytext); sep = "";
56" . |
57" \n { sep = "\n"; }
58" "/*" { BEGIN COMMENT; }
59" "//".* { }
60" <COMMENT>{
61" "*/" { BEGIN INITIAL; }
62" .|\n
63" }
64" <*><<EOF>> { // end of file
65" printf("\nEND\n");
66" yyterminate();
67" }
68" %%
69" void scan()
70" {
71" while (yylex())
72" continue;
73" }
74" /* main program */
75" int main()
76" {
77" scan();
78" }
Bram Moolenaar81af9252010-12-10 20:35:50 +010079
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020080" Definitions Section with initial code blocks, abbreviations, options, states
Bram Moolenaar5c736222010-01-06 20:54:52 +010081if has("folding")
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020082 syn region lexAbbrvBlock fold start="^\S" end="^\ze%%" skipnl nextgroup=lexPatBlock contains=lexOptions,lexAbbrv,lexInitialCodeBlock,lexInclude,lexAbbrvComment,lexStartState
Bram Moolenaar5c736222010-01-06 20:54:52 +010083else
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020084 syn region lexAbbrvBlock start="^\S" end="^\ze%%" skipnl nextgroup=lexPatBlock contains=lexOptions,lexAbbrv,lexInitialCodeBlock,lexInclude,lexAbbrvComment,lexStartState
Bram Moolenaar5c736222010-01-06 20:54:52 +010085endif
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020086syn match lexOptions "^%\a\+\(\s.*\|[^{]*\)$" contains=lexOptionsEq,lexPatString,lexSlashQuote,lexBrace,lexSlashBrace
87syn match lexOptionsEq "=" skipwhite contained
88syn match lexAbbrv "^\I\i*\s"me=e-1 skipwhite contained nextgroup=lexAbbrvPat
89syn match lexAbbrvPat "\s\S.*$"lc=1 contained contains=lexPatAbbrv,lexPatString,lexSlashQuote,lexBrace,lexSlashBrace nextgroup=lexAbbrv,lexInclude
90syn match lexStartState "^%\(xs\?\|s\)\(t\(a\(t\(e\?\)\?\)\?\)\?\)\?\(\s\+\I\i*\)\+\s*$" contained contains=lexStartStateCmd
91syn match lexStartStateCmd '^%\(xs\?\|s\)\(t\(a\(t\(e\?\)\?\)\?\)\?\)\?' contained
Bram Moolenaar5c736222010-01-06 20:54:52 +010092if has("folding")
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020093 syn region lexInitialCodeBlock fold start="^\s\+" end="^\S"me=e-1 contains=@lexCcode
94 syn region lexInclude fold matchgroup=lexSep start="^%\a*{" end="^%\?}" contained contains=@lexCcode,lexCFunctions
95 syn region lexAbbrvComment fold start="^\s*//" end="$" contains=@Spell
96 syn region lexAbbrvComment fold start="^\s*/\*" end="\*/" contains=@Spell
Bram Moolenaar5c736222010-01-06 20:54:52 +010097else
Bram Moolenaar7ceefb32020-05-01 16:07:38 +020098 syn region lexInitialCodeBlock start="^\s\+" end="^\S"me=e-1 contains=@lexCcode
99 syn region lexInclude matchgroup=lexSep start="^%\a*{" end="^%\?}" contained contains=@lexCcode,lexCFunctions
100 syn region lexAbbrvComment start="^\s*//" end="$" contains=@Spell
101 syn region lexAbbrvComment start="^\s*/\*" end="\*/" contains=@Spell
Bram Moolenaar5c736222010-01-06 20:54:52 +0100102endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000103
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200104" Rules Section with patterns and actions
Bram Moolenaar5c736222010-01-06 20:54:52 +0100105if has("folding")
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200106 syn region lexPatBlock fold matchgroup=Todo start="^%%" matchgroup=Todo end="^\ze%%" skipnl skipwhite nextgroup=lexFinalCodeBlock contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
107 syn region lexPat fold start="\S" skip="\\\\\|\\\s" end="\ze\(\s*$\|\s\+\(\h\|{\W\|{$\|[-+*]\|//\|/\*\)\)" skipwhite contained nextgroup=lexMorePat,lexPatSep,lexPatEnd contains=lexPatTag,lexPatString,lexSlashQuote,lexPatAbbrv,lexBrace,lexSlashBrace
108 syn region lexPatInclude fold matchgroup=lexSep start="^%{" end="^%}" contained contains=@lexCcode
109 syn region lexBrace fold matchgroup=Character start="\[" skip="\\.\|\[:\a\+:\]\|\[\.\a\+\.\]\|\[=.=\]" end="\]" contained
110 syn region lexPatString fold matchgroup=String start=+"+ skip=+\\\\\|\\"+ matchgroup=String end=+"+ contained
Bram Moolenaar5c736222010-01-06 20:54:52 +0100111else
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200112 syn region lexPatBlock matchgroup=Todo start="^%%" matchgroup=Todo end="^\ze%%" skipnl skipwhite nextgroup=lexFinalCodeBlock contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
113 syn region lexPat start="\S" skip="\\\\\|\\\s" end="\ze\(\s*$\|\s\+\(\h\|{\W\|{$\|[-+*]\|//\|/\*\)\)" skipwhite contained nextgroup=lexMorePat,lexPatSep,lexPatEnd contains=lexPatTag,lexPatString,lexSlashQuote,lexPatAbbrv,lexBrace,lexSlashBrace
114 syn region lexPatInclude matchgroup=lexSep start="^%{" end="^%}" contained contains=@lexCcode
115 syn region lexBrace matchgroup=Character start="\[" skip="\\.\|\[:\a\+:\]\|\[\.\a\+\.\]\|\[=.=\]" end="\]" contained
116 syn region lexPatString matchgroup=String start=+"+ skip=+\\\\\|\\"+ matchgroup=String end=+"+ contained
Bram Moolenaar5c736222010-01-06 20:54:52 +0100117endif
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200118syn match lexPatAbbrv "{\I\i*}"hs=s+1,he=e-1 contained
119syn match lexPatTag "^<\^\?\(\I\i*\|\*\)\(,\^\?\(\I\i*\|\*\)\)*>" contained nextgroup=lexPat,lexMorePat,lexPatSep,lexPatEnd
120syn match lexPatTagZone "^<\^\?\(\I\i*\|\*\)\(,\^\?\(\I\i*\|\*\)\)*>\s*{$"me=e-1 contained nextgroup=lexPatTagZoneStart
Bram Moolenaar97d62492012-11-15 21:28:22 +0100121
Bram Moolenaar5c736222010-01-06 20:54:52 +0100122if has("folding")
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200123 syn region lexPatTagZoneStart fold matchgroup=lexPatTag start='{$' end='^}' skipnl skipwhite contained contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
124 syn region lexPatComment fold start="//" end="$" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
125 syn region lexPatComment fold start="/\*" end="\*/" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
Bram Moolenaar5c736222010-01-06 20:54:52 +0100126else
Bram Moolenaar23515b42020-11-29 14:36:24 +0100127 syn region lexPatTagZoneStart matchgroup=lexPatTag start='{' end='^}' skipnl skipwhite contained contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200128 syn region lexPatComment start="//" end="$" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
129 syn region lexPatComment start="/\*" end="\*/" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
Bram Moolenaar5c736222010-01-06 20:54:52 +0100130endif
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200131syn match lexPatEnd "\s*$" skipnl contained
132syn match lexPatCodeLine "[^{\[].*" contained contains=@lexCcode,lexCFunctions
133syn match lexMorePat "\s*|\s*$" skipnl contained nextgroup=lexPat,lexPatTag,lexPatComment
134syn match lexPatSep "\s\+" contained nextgroup=lexMorePat,lexPatCode,lexPatCodeLine
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135syn match lexSlashQuote +\(\\\\\)*\\"+ contained
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200136syn match lexSlashBrace +\(\\\\\)*\\\[+ contained
Bram Moolenaar5c736222010-01-06 20:54:52 +0100137if has("folding")
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200138 syn region lexPatCode fold matchgroup=Delimiter start="{" end="}" skipnl contained contains=@lexCcode,lexCFunctions
Bram Moolenaar5c736222010-01-06 20:54:52 +0100139else
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200140 syn region lexPatCode matchgroup=Delimiter start="{" end="}" skipnl contained contains=@lexCcode,lexCFunctions
Bram Moolenaar5c736222010-01-06 20:54:52 +0100141endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200143" User Code Section with final code block
144syn region lexFinalCodeBlock matchgroup=Todo start="^%%" end="\%$" contained contains=@lexCcode
Bram Moolenaar071d4272004-06-13 20:20:40 +0000145
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200146" Lex macros which may appear in C/C++ code blocks
147syn keyword lexCFunctions BEGIN ECHO REJECT yytext YYText yyleng YYLeng yymore yyless yywrap yylook
148syn keyword lexCFunctions yyrestart yyterminate yylineno yycolumno yyin yyout
149syn keyword lexCFunctions input unput output winput wunput woutput
150syn keyword lexCFunctions yyinput yyunput yyoutput yywinput yywunput yywoutput
Bram Moolenaar97d62492012-11-15 21:28:22 +0100151
Bram Moolenaar071d4272004-06-13 20:20:40 +0000152" <c.vim> includes several ALLBUTs; these have to be treated so as to exclude lex* groups
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200153syn cluster cParenGroup add=lex.*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000154syn cluster cDefineGroup add=lex.*
155syn cluster cPreProcGroup add=lex.*
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200156syn cluster cMultiGroup add=lex.*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157
158" Synchronization
159syn sync clear
Bram Moolenaar97d62492012-11-15 21:28:22 +0100160syn sync minlines=500
Bram Moolenaar071d4272004-06-13 20:20:40 +0000161syn sync match lexSyncPat grouphere lexPatBlock "^%[a-zA-Z]"
162syn sync match lexSyncPat groupthere lexPatBlock "^<$"
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200163syn sync match lexSyncPat groupthere lexPatBlock "^%%"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000164
165" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200166if !exists("skip_lex_syntax_inits")
167 hi def link lexAbbrvComment lexPatComment
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200168 hi def link lexAbbrvPat lexPat
169 hi def link lexAbbrv Special
170 hi def link lexBrace lexPat
171 hi def link lexCFunctions PreProc
172 hi def link lexMorePat Special
173 hi def link lexOptions PreProc
174 hi def link lexOptionsEq Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200175 hi def link lexPatComment Comment
176 hi def link lexPat Function
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200177 hi def link lexPatString lexPat
178 hi def link lexPatAbbrv Special
179 hi def link lexPatTag Statement
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200180 hi def link lexPatTagZone lexPatTag
181 hi def link lexSep Delimiter
182 hi def link lexSlashQuote lexPat
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200183 hi def link lexSlashBrace lexPat
184 hi def link lexStartState lexPatTag
185 hi def link lexStartStateCmd Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200186endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187
188let b:current_syntax = "lex"
189
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200190" vim:ts=8