blob: 71765eab30a3d0802422618e5c983e49d3b620f7 [file] [log] [blame] [edit]
" Copyright 2019 Google LLC
"
" Licensed under the Apache License, Version 2.0 (the "License");
" you may not use this file except in compliance with the License.
" You may obtain a copy of the License at
"
" https://www.apache.org/licenses/LICENSE-2.0
"
" Unless required by applicable law or agreed to in writing, software
" distributed under the License is distributed on an "AS IS" BASIS,
" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
" See the License for the specific language governing permissions and
" limitations under the License.
" Vim syntax file for Emboss.
" Quit when a (custom) syntax file was already loaded.
if exists('b:current_syntax')
finish
endif
" TODO(bolms): Generate the syntax patterns from the patterns in tokenizer.py.
" Note that Python regex syntax and Vim regexp syntax differ significantly, and
" the matching logic Vim uses for syntactic elements is significantly different
" from what a tokenizer uses.
syn clear
" Emboss keywords.
syn keyword embStructure struct union enum bits external
syn keyword embKeyword $reserved $default
syn keyword embKeyword $static_size_in_bits $is_statically_sized this
syn keyword embKeyword $max $present $upper_bound $lower_bound
syn keyword embKeyword import as
syn keyword embKeyword if let
syn keyword embBoolean true false
syn keyword embIdentifier $size_in_bits $size_in_bytes
syn keyword embIdentifier $max_size_in_bits $max_size_in_bytes
syn keyword embIdentifier $min_size_in_bits $min_size_in_bytes
" Per standard convention, highlight to-do patterns in comments.
syn keyword embTodo contained TODO FIXME XXX
" When more than one syntax pattern matches a particular chunk of text, Vim
" picks the last one. These 'catch-all' patterns will match any word or number,
" valid or invalid; valid tokens will be matched again by later patterns,
" overriding the embBadNumber or embBadWord match.
syn match embBadNumber display '\v\C<[0-9][0-9a-zA-Z_$]*>'
syn match embBadWord display '\v\C<[A-Za-z_$][A-Za-z0-9_$]*>'
" Type names are always CamelCase, enum constants are always SHOUTY_CASE, and
" most other identifiers (field names, attribute names) are snake_case.
syn match embType display '\v\C<[A-Z][A-Z0-9]*[a-z][A-Za-z0-9]*>'
syn match embConstant display '\v\C<[A-Z][A-Z0-9_]+>'
syn match embIdentifier display '\v\C<[a-z][a-z0-9_]*>'
" Decimal integers both with and without thousands separators.
syn match embNumber display '\v\C<\d+>'
syn match embNumber display '\v\C<\d{1,3}(_\d{3})*>'
" Hex integers with and without word/doubleword separators.
syn match embNumber display '\v\C<0[xX]\x+>'
syn match embNumber display '\v\C<0[xX]\x{1,4}(_\x{4})*>'
syn match embNumber display '\v\C<0[xX]\x{1,8}(_\x{8})*>'
" Binary integers with and without byte/nibble separators.
syn match embNumber display '\v\C<0[bB][01]+>'
syn match embNumber display '\v\C<0[bB][01]{1,4}(_[01]{4})*>'
syn match embNumber display '\v\C<0[bB][01]{1,8}(_[01]{8})*>'
" Strings
syn match embString display '\v\C"([^"\n\\]|\\[n\\"])*"'
" Comments and documentation.
syn match embComment display contains=embTodo '\v\C\#.*$'
syn match embDocumentation display contains=embTodo '\v\C\-\- .*$'
syn match embDocumentation display '\v\C\-\-$'
syn match embBadDocumentation display '\v\C\-\-[^ ].*$'
" Most Emboss constructs map neatly onto the standard Vim syntax types.
hi def link embComment Comment
hi def link embConstant Constant
hi def link embIdentifier Identifier
hi def link embNumber Number
hi def link embOperator Operator
hi def link embString String
hi def link embStructure Structure
hi def link embTodo Todo
hi def link embType Type
" SpecialComment seems to be the best match for embDocumentation, as it is used
" for things like javadoc.
hi def link embDocumentation SpecialComment
hi def link embBadDocumentation Error
hi def link embBadWord Error
hi def link embBadNumber Error
let b:current_syntax = 'emboss'