neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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