lex.vim (8739B)
1 " Vim syntax file 2 " Language: Lex and Flex 3 " Maintainer: This runtime file is looking for a new maintainer. 4 " Former Maintainer: Charles E. Campbell 5 " Contributor: Robert A. van Engelen <engelen@acm.org> 6 " Version: 18 7 " Last Change: Apr 24, 2020 8 " 2024 Feb 19 by Vim Project (announce adoption) 9 10 " quit when a syntax file was already loaded 11 if exists("b:current_syntax") 12 finish 13 endif 14 15 " Read the C++ syntax to start with 16 let s:Cpath= fnameescape(expand("<sfile>:p:h")."/cpp.vim") 17 if !filereadable(s:Cpath) 18 for s:Cpath in split(globpath(&rtp,"syntax/cpp.vim"),"\n") 19 if filereadable(fnameescape(s:Cpath)) 20 let s:Cpath= fnameescape(s:Cpath) 21 break 22 endif 23 endfor 24 endif 25 exe "syn include @lexCcode ".s:Cpath 26 27 " --- ========= --- 28 " --- Lex stuff --- 29 " --- ========= --- 30 31 " 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 " } 79 80 " Definitions Section with initial code blocks, abbreviations, options, states 81 if has("folding") 82 syn region lexAbbrvBlock fold start="^\S" end="^\ze%%" skipnl nextgroup=lexPatBlock contains=lexOptions,lexAbbrv,lexInitialCodeBlock,lexInclude,lexAbbrvComment,lexStartState 83 else 84 syn region lexAbbrvBlock start="^\S" end="^\ze%%" skipnl nextgroup=lexPatBlock contains=lexOptions,lexAbbrv,lexInitialCodeBlock,lexInclude,lexAbbrvComment,lexStartState 85 endif 86 syn match lexOptions "^%\a\+\(\s.*\|[^{]*\)$" contains=lexOptionsEq,lexPatString,lexSlashQuote,lexBrace,lexSlashBrace 87 syn match lexOptionsEq "=" skipwhite contained 88 syn match lexAbbrv "^\I\i*\s"me=e-1 skipwhite contained nextgroup=lexAbbrvPat 89 syn match lexAbbrvPat "\s\S.*$"lc=1 contained contains=lexPatAbbrv,lexPatString,lexSlashQuote,lexBrace,lexSlashBrace nextgroup=lexAbbrv,lexInclude 90 syn match lexStartState "^%\(xs\?\|s\)\(t\(a\(t\(e\?\)\?\)\?\)\?\)\?\(\s\+\I\i*\)\+\s*$" contained contains=lexStartStateCmd 91 syn match lexStartStateCmd '^%\(xs\?\|s\)\(t\(a\(t\(e\?\)\?\)\?\)\?\)\?' contained 92 if has("folding") 93 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 97 else 98 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 102 endif 103 104 " Rules Section with patterns and actions 105 if has("folding") 106 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 111 else 112 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 117 endif 118 syn match lexPatAbbrv "{\I\i*}"hs=s+1,he=e-1 contained 119 syn match lexPatTag "^<\^\?\(\I\i*\|\*\)\(,\^\?\(\I\i*\|\*\)\)*>" contained nextgroup=lexPat,lexMorePat,lexPatSep,lexPatEnd 120 syn match lexPatTagZone "^<\^\?\(\I\i*\|\*\)\(,\^\?\(\I\i*\|\*\)\)*>\s*{$"me=e-1 contained nextgroup=lexPatTagZoneStart 121 122 if has("folding") 123 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 126 else 127 syn region lexPatTagZoneStart matchgroup=lexPatTag start='{' end='^}' skipnl skipwhite contained contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude 128 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 130 endif 131 syn match lexPatEnd "\s*$" skipnl contained 132 syn match lexPatCodeLine "[^{\[].*" contained contains=@lexCcode,lexCFunctions 133 syn match lexMorePat "\s*|\s*$" skipnl contained nextgroup=lexPat,lexPatTag,lexPatComment 134 syn match lexPatSep "\s\+" contained nextgroup=lexMorePat,lexPatCode,lexPatCodeLine 135 syn match lexSlashQuote +\(\\\\\)*\\"+ contained 136 syn match lexSlashBrace +\(\\\\\)*\\\[+ contained 137 if has("folding") 138 syn region lexPatCode fold matchgroup=Delimiter start="{" end="}" skipnl contained contains=@lexCcode,lexCFunctions 139 else 140 syn region lexPatCode matchgroup=Delimiter start="{" end="}" skipnl contained contains=@lexCcode,lexCFunctions 141 endif 142 143 " User Code Section with final code block 144 syn region lexFinalCodeBlock matchgroup=Todo start="^%%" end="\%$" contained contains=@lexCcode 145 146 " Lex macros which may appear in C/C++ code blocks 147 syn keyword lexCFunctions BEGIN ECHO REJECT yytext YYText yyleng YYLeng yymore yyless yywrap yylook 148 syn keyword lexCFunctions yyrestart yyterminate yylineno yycolumno yyin yyout 149 syn keyword lexCFunctions input unput output winput wunput woutput 150 syn keyword lexCFunctions yyinput yyunput yyoutput yywinput yywunput yywoutput 151 152 " <c.vim> includes several ALLBUTs; these have to be treated so as to exclude lex* groups 153 syn cluster cParenGroup add=lex.* 154 syn cluster cDefineGroup add=lex.* 155 syn cluster cPreProcGroup add=lex.* 156 syn cluster cMultiGroup add=lex.* 157 158 " Synchronization 159 syn sync clear 160 syn sync minlines=500 161 syn sync match lexSyncPat grouphere lexPatBlock "^%[a-zA-Z]" 162 syn sync match lexSyncPat groupthere lexPatBlock "^<$" 163 syn sync match lexSyncPat groupthere lexPatBlock "^%%" 164 165 " The default highlighting. 166 if !exists("skip_lex_syntax_inits") 167 hi def link lexAbbrvComment lexPatComment 168 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 175 hi def link lexPatComment Comment 176 hi def link lexPat Function 177 hi def link lexPatString lexPat 178 hi def link lexPatAbbrv Special 179 hi def link lexPatTag Statement 180 hi def link lexPatTagZone lexPatTag 181 hi def link lexSep Delimiter 182 hi def link lexSlashQuote lexPat 183 hi def link lexSlashBrace lexPat 184 hi def link lexStartState lexPatTag 185 hi def link lexStartStateCmd Special 186 endif 187 188 let b:current_syntax = "lex" 189 190 " vim:ts=8