| """ |
| 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), |
| ], |
| } |