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