vim-polyglot/syntax/ragel.vim
2015-07-18 23:05:45 +02:00

169 lines
5.9 KiB
VimL

if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ragel') == -1
" Vim syntax file
"
" Language: Ragel
" Author: Adrian Thurston
syntax clear
if !exists("g:ragel_default_subtype")
let g:ragel_default_subtype = 'c'
endif
function! <SID>Split(path) abort " {{{1
if type(a:path) == type([]) | return a:path | endif
let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,')
return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")')
endfunction " }}}1
fun! <SID>ReadOnPath(script)
for dir in <SID>Split(&rtp)
let filepath = dir.'/'.a:script
if filereadable(filepath)
return join(readfile(filepath), " | ")
endif
endfor
endfun
" Try to detect the subtype. stolen from eruby.vim
if !exists("b:ragel_subtype") || b:ragel_subtype == ''
" first check for an annotation in the first 5 lines or on the last line
let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$")
let b:ragel_subtype = matchstr(s:lines, 'ragel_subtype=\zs\w\+')
" failing that, check the filename for .*.rl
if b:ragel_subtype == ''
let b:ragel_subtype = matchstr(substitute(expand("%:t"),'\c\%(\.rl\|\.ragel\)\+$','',''),'\.\zs\w\+$')
" ...and do a couple of transformations if necessary
" .rb -> ruby
if b:ragel_subtype == 'rb'
let b:ragel_subtype = 'ruby'
" .m -> objc
elseif b:ragel_subtype == 'm'
let b:ragel_subtype = 'objc'
" .cxx -> cpp
elseif b:ragel_subtype == 'cxx'
let b:ragel_subtype = 'cpp'
endif
endif
" default to g:ragel_default_subtype
if b:ragel_subtype == ''
let b:ragel_subtype = g:ragel_default_subtype
endif
endif
if exists('b:ragel_subtype') && b:ragel_subtype != ''
exec 'runtime! syntax/'.b:ragel_subtype.'.vim'
" source s:subtype_file
unlet! b:current_syntax
endif
" Identifiers
syntax match anyId "[a-zA-Z_][a-zA-Z_0-9]*" contained
" Inline code only
syntax keyword fsmType fpc fc fcurs fbuf fblen ftargs fstack contained
syntax keyword fsmKeyword fhold fgoto fcall fret fentry fnext fexec fbreak contained
syntax cluster rlItems contains=rlComment,rlLiteral,rlAugmentOps,rlOtherOps,rlKeywords,rlWrite,rlCodeCurly,rlCodeSemi,rlNumber,anyId,rlLabelColon,rlExprKeywords
syntax region machineSpec1 matchgroup=beginRL start="%%{" end="}%%" contains=@rlItems
syntax region machineSpec2 matchgroup=beginRL start="%%[^{]"rs=e-1 end="$" keepend contains=@rlItems
syntax region machineSpec2 matchgroup=beginRL start="%%$" end="$" keepend contains=@rlItems
" Comments
syntax match rlComment "#.*$" contained
" Literals
" single quoted strings '...'
syntax match rlLiteral "'\(\\.\|[^'\\]\)*'[i]*" contained
" double quoted strings "..."
syntax match rlLiteral "\"\(\\.\|[^\"\\]\)*\"[i]*" contained
" simple regexes /.../
syntax match rlLiteral /\/\(\\.\|[^\/\\]\)*\/[i]*/ contained
" char unions [...]
syntax match rlLiteral "\[\(\\.\|[^\]\\]\)*\]" contained
" Numbers
syntax match rlNumber "[0-9][0-9]*" contained
syntax match rlNumber "0x[0-9a-fA-F][0-9a-fA-F]*" contained
" Operators
syntax match rlAugmentOps "[>$%@]" contained
syntax match rlAugmentOps "<>\|<" contained
syntax match rlAugmentOps "[>\<$%@][!\^/*~]" contained
syntax match rlAugmentOps "[>$%]?" contained
syntax match rlAugmentOps "<>[!\^/*~]" contained
syntax match rlAugmentOps "=>" contained
syntax match rlOtherOps "->" contained
syntax match rlOtherOps ":>" contained
syntax match rlOtherOps ":>>" contained
syntax match rlOtherOps "<:" contained
" Keywords
" FIXME: Enable the range keyword post 5.17.
" syntax keyword rlKeywords machine action context include range contained
syntax keyword rlKeywords machine action context include import export prepush postpop contained
syntax keyword rlExprKeywords when inwhen outwhen err lerr eof from to contained
" Case Labels
syntax keyword caseLabelKeyword case contained
syntax cluster caseLabelItems contains=caseLabelKeyword,anyId,fsmType,fsmKeyword
syntax match caseLabelColon "case" contains=@caseLabelItems contained
syntax match caseLabelColon "case[\t ]\+.*:$" contains=@caseLabelItems contained
syntax match caseLabelColon "case[\t ]\+.*:[^=:]"me=e-1 contains=@caseLabelItems contained
syntax match rlLabelColon "[a-zA-Z_][a-zA-Z_0-9]*[ \t]*:$" contained contains=anyLabel
syntax match rlLabelColon "[a-zA-Z_][a-zA-Z_0-9]*[ \t]*:[^=:>]"me=e-1 contained contains=anyLabel
syntax match anyLabel "[a-zA-Z_][a-zA-Z_0-9]*" contained
" All items that can go in a code block.
syntax cluster inlineItems contains=TOP add=anyId,fsmType,fsmKeyword,caseLabelColon
" Blocks of code. rlCodeCurly is recursive.
syntax region rlCodeCurly matchgroup=NONE start="{" end="}" keepend contained contains=TOP
syntax region rlCodeSemi matchgroup=Type start="\<alphtype\>" start="\<getkey\>" start="\<access\>" start="\<variable\>" matchgroup=NONE end=";" contained contains=@inlineItems
syntax region rlWrite matchgroup=Type start="\<write\>" matchgroup=NONE end="[;)]" contained contains=rlWriteKeywords,rlWriteOptions
syntax keyword rlWriteKeywords init data exec exports start error first_final contained
syntax keyword rlWriteOptions noerror nofinal noprefix noend nocs contained
"
" Sync at the start of machine specs.
"
" Match The ragel delimiters only if there quotes no ahead on the same line.
" On the open marker, use & to consume the leader.
syntax sync match ragelSyncPat grouphere NONE "^[^\'\"%]*%%{&^[^\'\"%]*"
syntax sync match ragelSyncPat grouphere NONE "^[^\'\"%]*%%[^{]&^[^\'\"%]*"
syntax sync match ragelSyncPat grouphere NONE "^[^\'\"]*}%%"
"
" Specifying Groups
"
hi link rlComment Comment
hi link rlNumber Number
hi link rlLiteral String
hi link rlAugmentOps Keyword
hi link rlExprKeywords Keyword
hi link rlWriteKeywords Keyword
hi link rlWriteOptions Keyword
hi link rlKeywords Type
hi link fsmType Type
hi link fsmKeyword Keyword
hi link anyLabel Label
hi link caseLabelKeyword Keyword
hi link beginRL Type
let b:current_syntax = "ragel"
endif