|
""" |
|
pygments.lexers.wgsl |
|
~~~~~~~~~~~~~~~~~~~~ |
|
|
|
Lexer for the WebGPU Shading Language. |
|
|
|
:copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. |
|
:license: BSD, see LICENSE for details. |
|
""" |
|
|
|
from pygments.lexer import RegexLexer, include, 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) + ']' |
|
|
|
|
|
ident_pattern_token = f'([{uni.xid_start}][{uni.xid_continue}]+)|[{uni.xid_start}]' |
|
|
|
|
|
class WgslLexer(RegexLexer): |
|
""" |
|
Lexer for the WebGPU Shading Language. |
|
""" |
|
name = 'WebGPU Shading Language' |
|
url = 'https://www.w3.org/TR/WGSL/' |
|
aliases = ['wgsl'] |
|
filenames = ['*.wgsl'] |
|
mimetypes = ['text/wgsl'] |
|
version_added = '2.15' |
|
|
|
|
|
keyword_decl = (words('var let const override'.split(),suffix=r'\b'), Keyword.Declaration) |
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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_alias_vectors = (words(""" |
|
vec2i vec3i vec4i |
|
vec2u vec3u vec4u |
|
vec2f vec3f vec4f |
|
vec2h vec3h vec4h |
|
""".split(), suffix=r'\b'), Name.Builtin) |
|
|
|
|
|
|
|
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': [ |
|
|
|
(r'[\u0020\u0009\u000a\u000b\u000c\u000d\u0085\u200e\u200f\u2028\u2029]+', Whitespace), |
|
], |
|
'comments': [ |
|
|
|
|
|
(rf'//{NotLineEndRE}*{CR}{LF}', Comment.Single), |
|
(rf'//{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'), |
|
|
|
|
|
|
|
|
|
(r'@', Name.Decorator, 'attribute'), |
|
|
|
|
|
(r'(true|false)\b', Keyword.Constant), |
|
keyword_decl, |
|
keywords, |
|
keyword_reserved, |
|
|
|
|
|
predeclared_enums, |
|
predeclared_types, |
|
predeclared_type_generators, |
|
predeclared_type_alias_vectors, |
|
predeclared_type_alias_matrices, |
|
|
|
|
|
|
|
|
|
(r'0[fh]', Number.Float), |
|
|
|
(r'[1-9][0-9]*[fh]', Number.Float), |
|
|
|
(r'[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?', Number.Float), |
|
|
|
(r'[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?', Number.Float), |
|
|
|
(r'[0-9]+[eE][+-]?[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]+\.[0-9a-fA-F]*([pP][+-]?[0-9]+[fh]?)?', Number.Float), |
|
(r'0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?', Number.Float), |
|
|
|
|
|
|
|
(r'0[xX][0-9a-fA-F]+[iu]?', Number.Hex), |
|
|
|
|
|
|
|
(r'[1-9][0-9]*[iu]?', Number.Integer), |
|
(r'0[iu]?', Number.Integer), |
|
|
|
|
|
(r'[{}()\[\],\.;:]', Punctuation), |
|
(r'->', Punctuation), |
|
(r'[+\-*/%&|<>^!~=]', Operator), |
|
|
|
|
|
|
|
|
|
|
|
(ident_pattern_token, Name), |
|
|
|
|
|
|
|
], |
|
'block_comment': [ |
|
|
|
(r'[^*/]+', Comment.Multiline), |
|
(r'/\*', Comment.Multiline, '#push'), |
|
(r'\*/', Comment.Multiline, '#pop'), |
|
(r'[*/]', Comment.Multiline), |
|
], |
|
} |
|
|