xref: /vim-8.2.3635/runtime/syntax/lex.vim (revision 23515b4e)
1071d4279SBram Moolenaar" Vim syntax file
2*7ceefb35SBram Moolenaar" Language:	Lex and Flex
31d9215b9SBram Moolenaar" Maintainer:	Charles E. Campbell <[email protected]>
4*7ceefb35SBram Moolenaar" Contributor:	Robert A. van Engelen <[email protected]>
5*7ceefb35SBram Moolenaar" Last Change:	Apr 24, 2020
6*7ceefb35SBram Moolenaar" Version:	18
7071d4279SBram Moolenaar
889bcfda6SBram Moolenaar" quit when a syntax file was already loaded
989bcfda6SBram Moolenaarif exists("b:current_syntax")
10071d4279SBram Moolenaar  finish
11071d4279SBram Moolenaarendif
12071d4279SBram Moolenaar
13*7ceefb35SBram Moolenaar" Read the C++ syntax to start with
14*7ceefb35SBram Moolenaarlet s:Cpath= fnameescape(expand("<sfile>:p:h")."/cpp.vim")
1597d62497SBram Moolenaarif !filereadable(s:Cpath)
16*7ceefb35SBram Moolenaar for s:Cpath in split(globpath(&rtp,"syntax/cpp.vim"),"\n")
1797d62497SBram Moolenaar  if filereadable(fnameescape(s:Cpath))
1897d62497SBram Moolenaar   let s:Cpath= fnameescape(s:Cpath)
1997d62497SBram Moolenaar   break
20071d4279SBram Moolenaar  endif
2197d62497SBram Moolenaar endfor
22071d4279SBram Moolenaarendif
2397d62497SBram Moolenaarexe "syn include @lexCcode ".s:Cpath
24071d4279SBram Moolenaar
25d4755bb0SBram Moolenaar" --- ========= ---
26071d4279SBram Moolenaar" --- Lex stuff ---
27d4755bb0SBram Moolenaar" --- ========= ---
28071d4279SBram Moolenaar
29*7ceefb35SBram Moolenaar" Definitions
30*7ceefb35SBram Moolenaar" %%
31*7ceefb35SBram Moolenaar" Rules
32*7ceefb35SBram Moolenaar" %%
33*7ceefb35SBram Moolenaar" User Code
34*7ceefb35SBram Moolenaar"
35*7ceefb35SBram Moolenaar" --- ======= ---
36*7ceefb35SBram Moolenaar" --- Example ---
37*7ceefb35SBram Moolenaar" --- ======= ---
38*7ceefb35SBram Moolenaar"
39*7ceefb35SBram Moolenaar"   // this is a valid lex file
40*7ceefb35SBram Moolenaar"   // indented initial code block
41*7ceefb35SBram Moolenaar"   #include <stdlib.h>
42*7ceefb35SBram Moolenaar" %{
43*7ceefb35SBram Moolenaar" // initial code block
44*7ceefb35SBram Moolenaar" #include <stdio.h>
45*7ceefb35SBram Moolenaar" const char *sep = "";
46*7ceefb35SBram Moolenaar" %}
47*7ceefb35SBram Moolenaar" %option outfile="scanner.c" noyywrap nodefault
48*7ceefb35SBram Moolenaar" %x COMMENT
49*7ceefb35SBram Moolenaar" id      [A-Za-z_][A-Za-z0-9_]*
50*7ceefb35SBram Moolenaar" %%
51*7ceefb35SBram Moolenaar"   // indented initial action code block
52*7ceefb35SBram Moolenaar"   printf("BEGIN");
53*7ceefb35SBram Moolenaar" {id}    printf("%s%s", sep, yytext); sep = "";
54*7ceefb35SBram Moolenaar" .       |
55*7ceefb35SBram Moolenaar" \n      { sep = "\n"; }
56*7ceefb35SBram Moolenaar" "/*"    { BEGIN COMMENT; }
57*7ceefb35SBram Moolenaar" "//".*  { }
58*7ceefb35SBram Moolenaar" <COMMENT>{
59*7ceefb35SBram Moolenaar" "*/"    { BEGIN INITIAL; }
60*7ceefb35SBram Moolenaar" .|\n
61*7ceefb35SBram Moolenaar" }
62*7ceefb35SBram Moolenaar" <*><<EOF>> { // end of file
63*7ceefb35SBram Moolenaar"              printf("\nEND\n");
64*7ceefb35SBram Moolenaar"              yyterminate();
65*7ceefb35SBram Moolenaar"            }
66*7ceefb35SBram Moolenaar" %%
67*7ceefb35SBram Moolenaar" void scan()
68*7ceefb35SBram Moolenaar" {
69*7ceefb35SBram Moolenaar"   while (yylex())
70*7ceefb35SBram Moolenaar"     continue;
71*7ceefb35SBram Moolenaar" }
72*7ceefb35SBram Moolenaar" /* main program */
73*7ceefb35SBram Moolenaar" int main()
74*7ceefb35SBram Moolenaar" {
75*7ceefb35SBram Moolenaar"   scan();
76*7ceefb35SBram Moolenaar" }
7781af9250SBram Moolenaar
78*7ceefb35SBram Moolenaar" Definitions Section with initial code blocks, abbreviations, options, states
795c73622aSBram Moolenaarif has("folding")
80*7ceefb35SBram Moolenaar syn region lexAbbrvBlock	fold	start="^\S"	end="^\ze%%"	skipnl	nextgroup=lexPatBlock	contains=lexOptions,lexAbbrv,lexInitialCodeBlock,lexInclude,lexAbbrvComment,lexStartState
815c73622aSBram Moolenaarelse
82*7ceefb35SBram Moolenaar syn region lexAbbrvBlock		start="^\S"	end="^\ze%%"	skipnl	nextgroup=lexPatBlock	contains=lexOptions,lexAbbrv,lexInitialCodeBlock,lexInclude,lexAbbrvComment,lexStartState
835c73622aSBram Moolenaarendif
84*7ceefb35SBram Moolenaarsyn match  lexOptions		"^%\a\+\(\s.*\|[^{]*\)$"				contains=lexOptionsEq,lexPatString,lexSlashQuote,lexBrace,lexSlashBrace
85*7ceefb35SBram Moolenaarsyn match  lexOptionsEq		"="					skipwhite	contained
86*7ceefb35SBram Moolenaarsyn match  lexAbbrv		"^\I\i*\s"me=e-1			skipwhite	contained	nextgroup=lexAbbrvPat
87*7ceefb35SBram Moolenaarsyn match  lexAbbrvPat		"\s\S.*$"lc=1						contained	contains=lexPatAbbrv,lexPatString,lexSlashQuote,lexBrace,lexSlashBrace	nextgroup=lexAbbrv,lexInclude
88*7ceefb35SBram Moolenaarsyn match  lexStartState	"^%\(xs\?\|s\)\(t\(a\(t\(e\?\)\?\)\?\)\?\)\?\(\s\+\I\i*\)\+\s*$"	contained	contains=lexStartStateCmd
89*7ceefb35SBram Moolenaarsyn match  lexStartStateCmd	'^%\(xs\?\|s\)\(t\(a\(t\(e\?\)\?\)\?\)\?\)\?'	contained
905c73622aSBram Moolenaarif has("folding")
91*7ceefb35SBram Moolenaar syn region lexInitialCodeBlock	fold				start="^\s\+"	end="^\S"me=e-1			contains=@lexCcode
92*7ceefb35SBram Moolenaar syn region lexInclude		fold	matchgroup=lexSep	start="^%\a*{"	end="^%\?}"	contained	contains=@lexCcode,lexCFunctions
93*7ceefb35SBram Moolenaar syn region lexAbbrvComment	fold				start="^\s*//"	end="$"		contains=@Spell
94*7ceefb35SBram Moolenaar syn region lexAbbrvComment	fold				start="^\s*/\*"	end="\*/"	contains=@Spell
955c73622aSBram Moolenaarelse
96*7ceefb35SBram Moolenaar syn region lexInitialCodeBlock					start="^\s\+"	end="^\S"me=e-1			contains=@lexCcode
97*7ceefb35SBram Moolenaar syn region lexInclude			matchgroup=lexSep	start="^%\a*{"	end="^%\?}"	contained	contains=@lexCcode,lexCFunctions
98*7ceefb35SBram Moolenaar syn region lexAbbrvComment					start="^\s*//"	end="$"		contains=@Spell
99*7ceefb35SBram Moolenaar syn region lexAbbrvComment					start="^\s*/\*"	end="\*/"	contains=@Spell
1005c73622aSBram Moolenaarendif
101071d4279SBram Moolenaar
102*7ceefb35SBram Moolenaar" Rules Section with patterns and actions
1035c73622aSBram Moolenaarif has("folding")
104*7ceefb35SBram Moolenaar syn region lexPatBlock		fold	matchgroup=Todo		start="^%%"	matchgroup=Todo		end="^\ze%%"	skipnl	skipwhite	nextgroup=lexFinalCodeBlock	contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
105*7ceefb35SBram Moolenaar 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
106*7ceefb35SBram Moolenaar syn region lexPatInclude	fold	matchgroup=lexSep	start="^%{"	end="^%}"	contained	contains=@lexCcode
107*7ceefb35SBram Moolenaar syn region lexBrace		fold	matchgroup=Character	start="\["	skip="\\.\|\[:\a\+:\]\|\[\.\a\+\.\]\|\[=.=\]"	end="\]"	contained
1085c73622aSBram Moolenaar syn region lexPatString	fold	matchgroup=String	start=+"+	skip=+\\\\\|\\"+	matchgroup=String	end=+"+	contained
1095c73622aSBram Moolenaarelse
110*7ceefb35SBram Moolenaar syn region lexPatBlock			matchgroup=Todo		start="^%%"	matchgroup=Todo		end="^\ze%%"	skipnl	skipwhite	nextgroup=lexFinalCodeBlock	contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
111*7ceefb35SBram Moolenaar 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
112*7ceefb35SBram Moolenaar syn region lexPatInclude		matchgroup=lexSep	start="^%{"	end="^%}"	contained	contains=@lexCcode
113*7ceefb35SBram Moolenaar syn region lexBrace			matchgroup=Character	start="\["	skip="\\.\|\[:\a\+:\]\|\[\.\a\+\.\]\|\[=.=\]"	end="\]"	contained
114071d4279SBram Moolenaar syn region lexPatString		matchgroup=String	start=+"+	skip=+\\\\\|\\"+	matchgroup=String	end=+"+	contained
1155c73622aSBram Moolenaarendif
116*7ceefb35SBram Moolenaarsyn match  lexPatAbbrv		"{\I\i*}"hs=s+1,he=e-1					contained
117*7ceefb35SBram Moolenaarsyn match  lexPatTag		"^<\^\?\(\I\i*\|\*\)\(,\^\?\(\I\i*\|\*\)\)*>"		contained	nextgroup=lexPat,lexMorePat,lexPatSep,lexPatEnd
118*7ceefb35SBram Moolenaarsyn match  lexPatTagZone	"^<\^\?\(\I\i*\|\*\)\(,\^\?\(\I\i*\|\*\)\)*>\s*{$"me=e-1	contained	nextgroup=lexPatTagZoneStart
11997d62497SBram Moolenaar
1205c73622aSBram Moolenaarif has("folding")
121*7ceefb35SBram Moolenaar syn region lexPatTagZoneStart	fold	matchgroup=lexPatTag	start='{$'	end='^}'	skipnl	skipwhite	contained	contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
122*7ceefb35SBram Moolenaar syn region lexPatComment	fold	start="//"	end="$"		skipnl	contained	contains=cTodo	skipwhite	nextgroup=lexPatComment,lexPat,@Spell
123*7ceefb35SBram Moolenaar syn region lexPatComment	fold	start="/\*"	end="\*/"	skipnl	contained	contains=cTodo	skipwhite	nextgroup=lexPatComment,lexPat,@Spell
1245c73622aSBram Moolenaarelse
125*7ceefb35SBram Moolenaar syn region lexPatTagZoneStart		matchgroup=lexPatTag		start='{'	end='^}'	skipnl	skipwhite	contained	contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
126*7ceefb35SBram Moolenaar syn region lexPatComment		start="//"	end="$"		skipnl	contained	contains=cTodo	skipwhite	nextgroup=lexPatComment,lexPat,@Spell
127*7ceefb35SBram Moolenaar syn region lexPatComment		start="/\*"	end="\*/"	skipnl	contained	contains=cTodo	skipwhite	nextgroup=lexPatComment,lexPat,@Spell
1285c73622aSBram Moolenaarendif
129*7ceefb35SBram Moolenaarsyn match  lexPatEnd		"\s*$"				skipnl	contained
130*7ceefb35SBram Moolenaarsyn match  lexPatCodeLine	"[^{\[].*"				contained	contains=@lexCcode,lexCFunctions
131071d4279SBram Moolenaarsyn match  lexMorePat		"\s*|\s*$"			skipnl	contained	nextgroup=lexPat,lexPatTag,lexPatComment
132071d4279SBram Moolenaarsyn match  lexPatSep		"\s\+"					contained	nextgroup=lexMorePat,lexPatCode,lexPatCodeLine
133071d4279SBram Moolenaarsyn match  lexSlashQuote	+\(\\\\\)*\\"+				contained
134*7ceefb35SBram Moolenaarsyn match  lexSlashBrace	+\(\\\\\)*\\\[+				contained
1355c73622aSBram Moolenaarif has("folding")
136*7ceefb35SBram Moolenaar syn region lexPatCode		fold	matchgroup=Delimiter	start="{"	end="}"	skipnl	contained	contains=@lexCcode,lexCFunctions
1375c73622aSBram Moolenaarelse
13897d62497SBram Moolenaar syn region lexPatCode			matchgroup=Delimiter	start="{"	end="}"	skipnl	contained	contains=@lexCcode,lexCFunctions
1395c73622aSBram Moolenaarendif
140071d4279SBram Moolenaar
141*7ceefb35SBram Moolenaar" User Code Section with final code block
142*7ceefb35SBram Moolenaarsyn region lexFinalCodeBlock	matchgroup=Todo	start="^%%"	end="\%$"	contained	contains=@lexCcode
143071d4279SBram Moolenaar
144*7ceefb35SBram Moolenaar" Lex macros which may appear in C/C++ code blocks
145*7ceefb35SBram Moolenaarsyn keyword lexCFunctions	BEGIN	ECHO	REJECT	yytext	YYText	yyleng	YYLeng	yymore	yyless	yywrap	yylook
146*7ceefb35SBram Moolenaarsyn keyword lexCFunctions	yyrestart	yyterminate	yylineno	yycolumno	yyin	yyout
147*7ceefb35SBram Moolenaarsyn keyword lexCFunctions	input	unput	output		winput		wunput		woutput
148*7ceefb35SBram Moolenaarsyn keyword lexCFunctions	yyinput	yyunput	yyoutput	yywinput	yywunput	yywoutput
14997d62497SBram Moolenaar
150071d4279SBram Moolenaar" <c.vim> includes several ALLBUTs; these have to be treated so as to exclude lex* groups
151071d4279SBram Moolenaarsyn cluster cParenGroup		add=lex.*
152071d4279SBram Moolenaarsyn cluster cDefineGroup	add=lex.*
153071d4279SBram Moolenaarsyn cluster cPreProcGroup	add=lex.*
154071d4279SBram Moolenaarsyn cluster cMultiGroup		add=lex.*
155071d4279SBram Moolenaar
156071d4279SBram Moolenaar" Synchronization
157071d4279SBram Moolenaarsyn sync clear
15897d62497SBram Moolenaarsyn sync minlines=500
159071d4279SBram Moolenaarsyn sync match lexSyncPat	grouphere  lexPatBlock	"^%[a-zA-Z]"
160071d4279SBram Moolenaarsyn sync match lexSyncPat	groupthere lexPatBlock	"^<$"
161*7ceefb35SBram Moolenaarsyn sync match lexSyncPat	groupthere lexPatBlock	"^%%"
162071d4279SBram Moolenaar
163071d4279SBram Moolenaar" The default highlighting.
164f37506f6SBram Moolenaarif !exists("skip_lex_syntax_inits")
165071d4279SBram Moolenaar hi def link lexAbbrvComment	lexPatComment
166*7ceefb35SBram Moolenaar hi def link lexAbbrvPat	lexPat
167*7ceefb35SBram Moolenaar hi def link lexAbbrv		Special
16897d62497SBram Moolenaar hi def link lexBrace		lexPat
169*7ceefb35SBram Moolenaar hi def link lexCFunctions	PreProc
170*7ceefb35SBram Moolenaar hi def link lexMorePat		Special
17181af9250SBram Moolenaar hi def link lexOptions		PreProc
172*7ceefb35SBram Moolenaar hi def link lexOptionsEq	Operator
173071d4279SBram Moolenaar hi def link lexPatComment	Comment
174d4755bb0SBram Moolenaar hi def link lexPat		Function
175*7ceefb35SBram Moolenaar hi def link lexPatString	lexPat
176*7ceefb35SBram Moolenaar hi def link lexPatAbbrv	Special
177*7ceefb35SBram Moolenaar hi def link lexPatTag		Statement
17897d62497SBram Moolenaar hi def link lexPatTagZone	lexPatTag
179071d4279SBram Moolenaar hi def link lexSep		Delimiter
18097d62497SBram Moolenaar hi def link lexSlashQuote	lexPat
181*7ceefb35SBram Moolenaar hi def link lexSlashBrace	lexPat
182*7ceefb35SBram Moolenaar hi def link lexStartState	lexPatTag
183*7ceefb35SBram Moolenaar hi def link lexStartStateCmd	Special
184f37506f6SBram Moolenaarendif
185071d4279SBram Moolenaar
186071d4279SBram Moolenaarlet b:current_syntax = "lex"
187071d4279SBram Moolenaar
188*7ceefb35SBram Moolenaar" vim:ts=8
189