blob: a6b926be9863a94a71369c987b01027928e63a76 [file] [log] [blame]
rhysdbc8f79d2023-11-14 16:46:07 +01001" Vim syntax file
2" Language: WebAssembly
3" Maintainer: rhysd <lin90162@yahoo.co.jp>
4" Last Change: Nov 14, 2023
5" For bugs, patches and license go to https://github.com/rhysd/vim-wasm
6
7if exists("b:current_syntax")
8 finish
9endif
10
11let s:cpo_save = &cpo
12set cpo&vim
13
14syn cluster watNotTop contains=watModule,watInstWithType,watInstGetSet,watInstGeneral,watParamInst,watControlInst,watSimdInst,watString,watNamedVar,watUnnamedVar,watFloat,watNumber,watComment,watList,watType
15
16" Instructions
17" https://webassembly.github.io/spec/core/text/instructions.html
18" Note: memarg (align=,offset=) can be added to memory instructions
19syn match watInstWithType "\%((\s*\)\@<=\<\%(i32\|i64\|f32\|f64\|memory\)\.[[:alnum:]_]\+\%(/\%(i32\|i64\|f32\|f64\)\)\=\>\%(\s\+\%(align\|offset\)=\)\=" contained display
20syn match watInstGeneral "\%((\s*\)\@<=\<[[:alnum:]_]\+\>" contained display
21syn match watInstGetSet "\%((\s*\)\@<=\<\%(local\|global\)\.\%(get\|set\)\>" contained display
22" https://webassembly.github.io/spec/core/text/instructions.html#control-instructions
23syn match watControlInst "\%((\s*\)\@<=\<\%(block\|end\|loop\|if\|then\|else\|unreachable\|nop\|br\|br_if\|br_table\|return\|call\|call_indirect\)\>" contained display
24" https://webassembly.github.io/spec/core/text/instructions.html#parametric-instructions
25syn match watParamInst "\%((\s*\)\@<=\<\%(drop\|select\)\>" contained display
26" SIMD instructions
27" https://webassembly.github.io/simd/core/text/instructions.html#simd-instructions
28syn match watSimdInst "\<\%(v128\|i8x16\|i16x8\|i32x4\|i64x2\|f32x4\|f64x2)\)\.[[:alnum:]_]\+\%(\s\+\%(i8x16\|i16x8\|i32x4\|i64x2\|f32x4\|f64x2\)\)\=\>" contained display
29
30" Identifiers
31" https://webassembly.github.io/spec/core/text/values.html#text-id
32syn match watNamedVar "$\+[[:alnum:]!#$%&'∗./:=><?@\\^_`~+-]*" contained contains=watEscapeUtf8
33syn match watUnnamedVar "$\+\d\+[[:alnum:]!#$%&'∗./:=><?@\\^_`~+-]\@!" contained display
34" Presuming the source text is itself encoded correctly, strings that do not
35" contain any uses of hexadecimal byte escapes are always valid names.
36" https://webassembly.github.io/spec/core/text/values.html#names
37syn match watEscapedUtf8 "\\\x\{1,6}" contained containedin=watNamedVar display
38
39" String literals
40" https://webassembly.github.io/spec/core/text/values.html#strings
41syn region watString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained contains=watStringSpecial
42syn match watStringSpecial "\\\x\x\|\\[tnr'\\\"]\|\\u\x\+" contained containedin=watString display
43
44" Float literals
45" https://webassembly.github.io/spec/core/text/values.html#floating-point
46syn match watFloat "\<-\=\d\%(_\=\d\)*\%(\.\d\%(_\=\d\)*\)\=\%([eE][-+]\=\d\%(_\=\d\)*\)\=" display contained
47syn match watFloat "\<-\=0x\x\%(_\=\x\)*\%(\.\x\%(_\=\x\)*\)\=\%([pP][-+]\=\d\%(_\=\d\)*\)\=" display contained
48syn keyword watFloat inf nan contained
49syn match watFloat "nan:0x\x\%(_\=\x\)*" display contained
50
51" Integer literals
52" https://webassembly.github.io/spec/core/text/values.html#integers
53syn match watNumber "\<-\=\d\%(_\=\d\)*\>" display contained
54syn match watNumber "\<-\=0x\x\%(_\=\x\)*\>" display contained
55
56" Comments
57" https://webassembly.github.io/spec/core/text/lexical.html#comments
58syn region watComment start=";;" end="$"
59syn region watComment start="(;;\@!" end=";)"
60
61syn region watList matchgroup=watListDelimiter start="(;\@!" matchgroup=watListDelimiter end=";\@<!)" contains=@watNotTop
62
63" Types
64" https://webassembly.github.io/spec/core/text/types.html
65" Note: `mut` was changed to `const`/`var` at Wasm 2.0
66syn keyword watType i64 i32 f64 f32 param result funcref func externref extern mut v128 const var contained
67syn match watType "\%((\_s*\)\@<=func\%(\_s*[()]\)\@=" display contained
68
69" Modules
70" https://webassembly.github.io/spec/core/text/modules.html
71syn keyword watModule module type export import table memory global data elem contained
72syn match watModule "\%((\_s*\)\@<=func\%(\_s\+\$\)\@=" display contained
73
74syn sync maxlines=100
75
76hi def link watModule PreProc
77hi def link watListDelimiter Delimiter
78hi def link watInstWithType Operator
79hi def link watInstGetSet Operator
80hi def link watInstGeneral Operator
81hi def link watControlInst Statement
82hi def link watSimdInst Operator
83hi def link watParamInst Conditional
84hi def link watString String
85hi def link watStringSpecial Special
86hi def link watNamedVar Identifier
87hi def link watUnnamedVar PreProc
88hi def link watFloat Float
89hi def link watNumber Number
90hi def link watComment Comment
91hi def link watType Type
92hi def link watEscapedUtf8 Special
93
94let b:current_syntax = "wat"
95
96let &cpo = s:cpo_save
97unlet s:cpo_save