summaryrefslogtreecommitdiffstats
path: root/runtime/syntax/wat.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/syntax/wat.vim')
-rw-r--r--runtime/syntax/wat.vim97
1 files changed, 97 insertions, 0 deletions
diff --git a/runtime/syntax/wat.vim b/runtime/syntax/wat.vim
new file mode 100644
index 0000000..a6b926b
--- /dev/null
+++ b/runtime/syntax/wat.vim
@@ -0,0 +1,97 @@
+" Vim syntax file
+" Language: WebAssembly
+" Maintainer: rhysd <lin90162@yahoo.co.jp>
+" Last Change: Nov 14, 2023
+" For bugs, patches and license go to https://github.com/rhysd/vim-wasm
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn cluster watNotTop contains=watModule,watInstWithType,watInstGetSet,watInstGeneral,watParamInst,watControlInst,watSimdInst,watString,watNamedVar,watUnnamedVar,watFloat,watNumber,watComment,watList,watType
+
+" Instructions
+" https://webassembly.github.io/spec/core/text/instructions.html
+" Note: memarg (align=,offset=) can be added to memory instructions
+syn match watInstWithType "\%((\s*\)\@<=\<\%(i32\|i64\|f32\|f64\|memory\)\.[[:alnum:]_]\+\%(/\%(i32\|i64\|f32\|f64\)\)\=\>\%(\s\+\%(align\|offset\)=\)\=" contained display
+syn match watInstGeneral "\%((\s*\)\@<=\<[[:alnum:]_]\+\>" contained display
+syn match watInstGetSet "\%((\s*\)\@<=\<\%(local\|global\)\.\%(get\|set\)\>" contained display
+" https://webassembly.github.io/spec/core/text/instructions.html#control-instructions
+syn match watControlInst "\%((\s*\)\@<=\<\%(block\|end\|loop\|if\|then\|else\|unreachable\|nop\|br\|br_if\|br_table\|return\|call\|call_indirect\)\>" contained display
+" https://webassembly.github.io/spec/core/text/instructions.html#parametric-instructions
+syn match watParamInst "\%((\s*\)\@<=\<\%(drop\|select\)\>" contained display
+" SIMD instructions
+" https://webassembly.github.io/simd/core/text/instructions.html#simd-instructions
+syn match watSimdInst "\<\%(v128\|i8x16\|i16x8\|i32x4\|i64x2\|f32x4\|f64x2)\)\.[[:alnum:]_]\+\%(\s\+\%(i8x16\|i16x8\|i32x4\|i64x2\|f32x4\|f64x2\)\)\=\>" contained display
+
+" Identifiers
+" https://webassembly.github.io/spec/core/text/values.html#text-id
+syn match watNamedVar "$\+[[:alnum:]!#$%&'∗./:=><?@\\^_`~+-]*" contained contains=watEscapeUtf8
+syn match watUnnamedVar "$\+\d\+[[:alnum:]!#$%&'∗./:=><?@\\^_`~+-]\@!" contained display
+" Presuming the source text is itself encoded correctly, strings that do not
+" contain any uses of hexadecimal byte escapes are always valid names.
+" https://webassembly.github.io/spec/core/text/values.html#names
+syn match watEscapedUtf8 "\\\x\{1,6}" contained containedin=watNamedVar display
+
+" String literals
+" https://webassembly.github.io/spec/core/text/values.html#strings
+syn region watString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained contains=watStringSpecial
+syn match watStringSpecial "\\\x\x\|\\[tnr'\\\"]\|\\u\x\+" contained containedin=watString display
+
+" Float literals
+" https://webassembly.github.io/spec/core/text/values.html#floating-point
+syn match watFloat "\<-\=\d\%(_\=\d\)*\%(\.\d\%(_\=\d\)*\)\=\%([eE][-+]\=\d\%(_\=\d\)*\)\=" display contained
+syn match watFloat "\<-\=0x\x\%(_\=\x\)*\%(\.\x\%(_\=\x\)*\)\=\%([pP][-+]\=\d\%(_\=\d\)*\)\=" display contained
+syn keyword watFloat inf nan contained
+syn match watFloat "nan:0x\x\%(_\=\x\)*" display contained
+
+" Integer literals
+" https://webassembly.github.io/spec/core/text/values.html#integers
+syn match watNumber "\<-\=\d\%(_\=\d\)*\>" display contained
+syn match watNumber "\<-\=0x\x\%(_\=\x\)*\>" display contained
+
+" Comments
+" https://webassembly.github.io/spec/core/text/lexical.html#comments
+syn region watComment start=";;" end="$"
+syn region watComment start="(;;\@!" end=";)"
+
+syn region watList matchgroup=watListDelimiter start="(;\@!" matchgroup=watListDelimiter end=";\@<!)" contains=@watNotTop
+
+" Types
+" https://webassembly.github.io/spec/core/text/types.html
+" Note: `mut` was changed to `const`/`var` at Wasm 2.0
+syn keyword watType i64 i32 f64 f32 param result funcref func externref extern mut v128 const var contained
+syn match watType "\%((\_s*\)\@<=func\%(\_s*[()]\)\@=" display contained
+
+" Modules
+" https://webassembly.github.io/spec/core/text/modules.html
+syn keyword watModule module type export import table memory global data elem contained
+syn match watModule "\%((\_s*\)\@<=func\%(\_s\+\$\)\@=" display contained
+
+syn sync maxlines=100
+
+hi def link watModule PreProc
+hi def link watListDelimiter Delimiter
+hi def link watInstWithType Operator
+hi def link watInstGetSet Operator
+hi def link watInstGeneral Operator
+hi def link watControlInst Statement
+hi def link watSimdInst Operator
+hi def link watParamInst Conditional
+hi def link watString String
+hi def link watStringSpecial Special
+hi def link watNamedVar Identifier
+hi def link watUnnamedVar PreProc
+hi def link watFloat Float
+hi def link watNumber Number
+hi def link watComment Comment
+hi def link watType Type
+hi def link watEscapedUtf8 Special
+
+let b:current_syntax = "wat"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save