123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- """
- pygments.lexers.wgsl
- ~~~~~~~~~~~~~~~~~~~~
- Lexer for the WebGPU Shading Language.
- :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
- :license: BSD, see LICENSE for details.
- """
- from pygments.lexer import RegexLexer, include, bygroups, words, default
- from pygments.token import Comment, Operator, Keyword, Name, \
- Number, Punctuation, Whitespace
- from pygments import unistring as uni
- __all__ = ['WgslLexer']
- LF = '\\u000a'
- VT = '\\u000b'
- FF = '\\u000c'
- CR = '\\u000d'
- NextLine = '\\u0085'
- LineSep = '\\u2028'
- ParaSep = '\\u2029'
- LineEndCodePoints = [LF,VT,FF,CR,NextLine,LineSep,ParaSep]
- NotLineEndRE = '[^' + "".join(LineEndCodePoints) + ']'
- LineEndRE = '[' + "".join(LineEndCodePoints) + ']'
- # https://www.w3.org/TR/WGSL/#syntax-ident_pattern_token
- ident_pattern_token = '([{}][{}]+)|[{}]'.format(uni.xid_start,uni.xid_continue,uni.xid_start)
- class WgslLexer(RegexLexer):
- """
- Lexer for the WebGPU Shading Language.
- .. versionadded:: 2.15
- """
- name = 'WebGPU Shading Language'
- url = 'https://www.w3.org/TR/WGSL/'
- aliases = ['wgsl']
- filenames = ['*.wgsl']
- mimetypes = ['text/wgsl']
- # https://www.w3.org/TR/WGSL/#var-and-value
- keyword_decl = (words('var let const override'.split(),suffix=r'\b'), Keyword.Declaration)
- # https://www.w3.org/TR/WGSL/#keyword-summary
- keywords = (words("""
- alias
- break
- case
- const_assert
- continue
- continuing
- default
- diagnostic
- discard
- else
- enable
- false
- fn
- for
- if
- loop
- requires
- return
- struct
- switch
- true
- while
- """.split(), suffix=r'\b'), Keyword)
- # https://www.w3.org/TR/WGSL/#reserved-words
- keyword_reserved = (words("""
- NULL
- Self
- abstract
- active
- alignas
- alignof
- as
- asm
- asm_fragment
- async
- attribute
- auto
- await
- become
- binding_array
- cast
- catch
- class
- co_await
- co_return
- co_yield
- coherent
- column_major
- common
- compile
- compile_fragment
- concept
- const_cast
- consteval
- constexpr
- constinit
- crate
- debugger
- decltype
- delete
- demote
- demote_to_helper
- do
- dynamic_cast
- enum
- explicit
- export
- extends
- extern
- external
- fallthrough
- filter
- final
- finally
- friend
- from
- fxgroup
- get
- goto
- groupshared
- highp
- impl
- implements
- import
- inline
- instanceof
- interface
- layout
- lowp
- macro
- macro_rules
- match
- mediump
- meta
- mod
- module
- move
- mut
- mutable
- namespace
- new
- nil
- noexcept
- noinline
- nointerpolation
- noperspective
- null
- nullptr
- of
- operator
- package
- packoffset
- partition
- pass
- patch
- pixelfragment
- precise
- precision
- premerge
- priv
- protected
- pub
- public
- readonly
- ref
- regardless
- register
- reinterpret_cast
- require
- resource
- restrict
- self
- set
- shared
- sizeof
- smooth
- snorm
- static
- static_assert
- static_cast
- std
- subroutine
- super
- target
- template
- this
- thread_local
- throw
- trait
- try
- type
- typedef
- typeid
- typename
- typeof
- union
- unless
- unorm
- unsafe
- unsized
- use
- using
- varying
- virtual
- volatile
- wgsl
- where
- with
- writeonly
- yield
- """.split(), suffix=r'\b'), Keyword.Reserved)
- # https://www.w3.org/TR/WGSL/#predeclared-enumerants
- predeclared_enums = (words("""
- read write read_write
- function private workgroup uniform storage
- perspective linear flat
- center centroid sample
- vertex_index instance_index position front_facing frag_depth
- local_invocation_id local_invocation_index
- global_invocation_id workgroup_id num_workgroups
- sample_index sample_mask
- rgba8unorm
- rgba8snorm
- rgba8uint
- rgba8sint
- rgba16uint
- rgba16sint
- rgba16float
- r32uint
- r32sint
- r32float
- rg32uint
- rg32sint
- rg32float
- rgba32uint
- rgba32sint
- rgba32float
- bgra8unorm
- """.split(), suffix=r'\b'), Name.Builtin)
- # https://www.w3.org/TR/WGSL/#predeclared-types
- predeclared_types = (words("""
- bool
- f16
- f32
- i32
- sampler sampler_comparison
- texture_depth_2d
- texture_depth_2d_array
- texture_depth_cube
- texture_depth_cube_array
- texture_depth_multisampled_2d
- texture_external
- texture_external
- u32
- """.split(), suffix=r'\b'), Name.Builtin)
- # https://www.w3.org/TR/WGSL/#predeclared-types
- predeclared_type_generators = (words("""
- array
- atomic
- mat2x2
- mat2x3
- mat2x4
- mat3x2
- mat3x3
- mat3x4
- mat4x2
- mat4x3
- mat4x4
- ptr
- texture_1d
- texture_2d
- texture_2d_array
- texture_3d
- texture_cube
- texture_cube_array
- texture_multisampled_2d
- texture_storage_1d
- texture_storage_2d
- texture_storage_2d_array
- texture_storage_3d
- vec2
- vec3
- vec4
- """.split(), suffix=r'\b'), Name.Builtin)
- # Predeclared type aliases for vectors
- # https://www.w3.org/TR/WGSL/#vector-types
- predeclared_type_alias_vectors = (words("""
- vec2i vec3i vec4i
- vec2u vec3u vec4u
- vec2f vec3f vec4f
- vec2h vec3h vec4h
- """.split(), suffix=r'\b'), Name.Builtin)
- # Predeclared type aliases for matrices
- # https://www.w3.org/TR/WGSL/#matrix-types
- predeclared_type_alias_matrices = (words("""
- mat2x2f mat2x3f mat2x4f
- mat3x2f mat3x3f mat3x4f
- mat4x2f mat4x3f mat4x4f
- mat2x2h mat2x3h mat2x4h
- mat3x2h mat3x3h mat3x4h
- mat4x2h mat4x3h mat4x4h
- """.split(), suffix=r'\b'), Name.Builtin)
- tokens = {
- 'blankspace': [
- # https://www.w3.org/TR/WGSL/#blankspace
- (r'[\u0020\u0009\u000a\u000b\u000c\u000d\u0085\u200e\u200f\u2028\u2029]+', Whitespace),
- ],
- 'comments': [
- # Line ending comments
- # Match up CR/LF pair first.
- (r'//{}*{}{}'.format(NotLineEndRE,CR,LF), Comment.Single),
- (r'//{}*{}'.format(NotLineEndRE,LineEndRE), Comment.Single),
- (r'/\*', Comment.Multiline, 'block_comment'),
- ],
- 'attribute': [
- include('blankspace'),
- include('comments'),
- (ident_pattern_token, Name.Decorator,'#pop'),
- default('#pop'),
- ],
- 'root': [
- include('blankspace'),
- include('comments'),
- # Attributes.
- # https://www.w3.org/TR/WGSL/#attributes
- # Mark the '@' and the attribute name as a decorator.
- (r'@', Name.Decorator, 'attribute'),
- # Keywords
- (r'(true|false)\b', Keyword.Constant),
- keyword_decl,
- keywords,
- keyword_reserved,
- # Predeclared
- predeclared_enums,
- predeclared_types,
- predeclared_type_generators,
- predeclared_type_alias_vectors,
- predeclared_type_alias_matrices,
- # Decimal float literals
- # https://www.w3.org/TR/WGSL/#syntax-decimal_float_literal
- # 0, with type-specifying suffix.
- (r'0[fh]', Number.Float),
- # Other decimal integer, with type-specifying suffix.
- (r'[1-9][0-9]*[fh]', Number.Float),
- # Has decimal point, at least one digit after decimal.
- (r'[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?', Number.Float),
- # Has decimal point, at least one digit before decimal.
- (r'[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?', Number.Float),
- # Has at least one digit, and has an exponent.
- (r'[0-9]+[eE][+-]?[0-9]+[fh]?', Number.Float),
- # Hex float literals
- # https://www.w3.org/TR/WGSL/#syntax-hex_float_literal
- (r'0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+([pP][+-]?[0-9]+[fh]?)?', Number.Float),
- (r'0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*([pP][+-]?[0-9]+[fh]?)?', Number.Float),
- (r'0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?', Number.Float),
- # Hexadecimal integer literals
- # https://www.w3.org/TR/WGSL/#syntax-hex_int_literal
- (r'0[xX][0-9a-fA-F]+[iu]?', Number.Hex),
- # Decimal integer literals
- # https://www.w3.org/TR/WGSL/#syntax-decimal_int_literal
- # We need two rules here because 01 is not valid.
- (r'[1-9][0-9]*[iu]?', Number.Integer),
- (r'0[iu]?', Number.Integer), # Must match last.
- # Operators and Punctuation
- (r'[{}()\[\],\.;:]', Punctuation),
- (r'->', Punctuation), # Return-type arrow
- (r'[+\-*/%&|<>^!~=]', Operator),
- # TODO: Treat context-depedendent names specially
- # https://www.w3.org/TR/WGSL/#context-dependent-name
- # Identifiers
- (ident_pattern_token, Name),
- # TODO: templates start and end tokens.
- # https://www.w3.org/TR/WGSL/#template-lists-sec
- ],
- 'block_comment': [
- # https://www.w3.org/TR/WGSL/#block-comment
- (r'[^*/]+', Comment.Multiline),
- (r'/\*', Comment.Multiline, '#push'),
- (r'\*/', Comment.Multiline, '#pop'),
- (r'[*/]', Comment.Multiline),
- ],
- }
|