@wgslx/wgslx
Version:
Extended WebGPU shading language tools
775 lines (643 loc) • 21 kB
text/typescript
// GENERATED FILE. DO NOT EDIT. RUN `npm run generate`
import { maybe, sequence, star, symbol, union } from "./rules";
// CONSTANTS
const TEMPLATE_ARGS_START = '❬';
const TEMPLATE_ARGS_END = '❭';
const SHIFT_LEFT = '<<';
const SHIFT_RIGHT = '>>';
const LESS_THAN = '<';
const GREATER_THAN = '>';
const LESS_THAN_EQUAL = '<=';
const GREATER_THAN_EQUAL = '>=';
const SHIFT_LEFT_ASSIGN = '<<=';
const SHIFT_RIGHT_ASSIGN = '>>=';
// DECLARATIONS
export const translationUnit = symbol('translation_unit');
export const globalDirective = symbol('global_directive');
export const globalDecl = symbol('global_decl');
export const boolLiteral = symbol('bool_literal');
export const intLiteral = symbol('int_literal');
export const decimalIntLiteral = symbol('decimal_int_literal');
export const hexIntLiteral = symbol('hex_int_literal');
export const floatLiteral = symbol('float_literal');
export const decimalFloatLiteral = symbol('decimal_float_literal');
export const hexFloatLiteral = symbol('hex_float_literal');
export const diagnosticDirective = symbol('diagnostic_directive');
export const literal = symbol('literal');
export const ident = symbol('ident');
export const memberIdent = symbol('member_ident');
export const diagnosticNameToken = symbol('diagnostic_name_token');
export const diagnosticRuleName = symbol('diagnostic_rule_name');
export const templateList = symbol('template_list');
export const templateArgCommaList = symbol('template_arg_comma_list');
export const templateArgExpression = symbol('template_arg_expression');
export const alignAttr = symbol('align_attr');
export const bindingAttr = symbol('binding_attr');
export const builtinAttr = symbol('builtin_attr');
export const builtinValueName = symbol('builtin_value_name');
export const constAttr = symbol('const_attr');
export const diagnosticAttr = symbol('diagnostic_attr');
export const groupAttr = symbol('group_attr');
export const idAttr = symbol('id_attr');
export const interpolateAttr = symbol('interpolate_attr');
export const interpolateTypeName = symbol('interpolate_type_name');
export const interpolateSamplingName = symbol('interpolate_sampling_name');
export const invariantAttr = symbol('invariant_attr');
export const locationAttr = symbol('location_attr');
export const mustUseAttr = symbol('must_use_attr');
export const sizeAttr = symbol('size_attr');
export const workgroupSizeAttr = symbol('workgroup_size_attr');
export const vertexAttr = symbol('vertex_attr');
export const fragmentAttr = symbol('fragment_attr');
export const computeAttr = symbol('compute_attr');
export const attribute = symbol('attribute');
export const diagnosticControl = symbol('diagnostic_control');
export const structDecl = symbol('struct_decl');
export const structBodyDecl = symbol('struct_body_decl');
export const structMember = symbol('struct_member');
export const typeAliasDecl = symbol('type_alias_decl');
export const typeSpecifier = symbol('type_specifier');
export const templateElaboratedIdent = symbol('template_elaborated_ident');
export const variableOrValueStatement = symbol('variable_or_value_statement');
export const variableDecl = symbol('variable_decl');
export const optionallyTypedIdent = symbol('optionally_typed_ident');
export const globalVariableDecl = symbol('global_variable_decl');
export const globalValueDecl = symbol('global_value_decl');
export const primaryExpression = symbol('primary_expression');
export const callExpression = symbol('call_expression');
export const callPhrase = symbol('call_phrase');
export const parenExpression = symbol('paren_expression');
export const argumentExpressionList = symbol('argument_expression_list');
export const expressionCommaList = symbol('expression_comma_list');
export const componentOrSwizzleSpecifier = symbol('component_or_swizzle_specifier');
export const unaryExpression = symbol('unary_expression');
export const singularExpression = symbol('singular_expression');
export const lhsExpression = symbol('lhs_expression');
export const coreLhsExpression = symbol('core_lhs_expression');
export const multiplicativeExpression = symbol('multiplicative_expression');
export const multiplicativeOperator = symbol('multiplicative_operator');
export const additiveExpression = symbol('additive_expression');
export const additiveOperator = symbol('additive_operator');
export const shiftExpression = symbol('shift_expression');
export const relationalExpression = symbol('relational_expression');
export const shortCircuitAndExpression = symbol('short_circuit_and_expression');
export const shortCircuitOrExpression = symbol('short_circuit_or_expression');
export const binaryOrExpression = symbol('binary_or_expression');
export const binaryAndExpression = symbol('binary_and_expression');
export const binaryXorExpression = symbol('binary_xor_expression');
export const bitwiseExpression = symbol('bitwise_expression');
export const expression = symbol('expression');
export const compoundStatement = symbol('compound_statement');
export const assignmentStatement = symbol('assignment_statement');
export const compoundAssignmentOperator = symbol('compound_assignment_operator');
export const incrementStatement = symbol('increment_statement');
export const decrementStatement = symbol('decrement_statement');
export const ifStatement = symbol('if_statement');
export const ifClause = symbol('if_clause');
export const elseIfClause = symbol('else_if_clause');
export const elseClause = symbol('else_clause');
export const switchStatement = symbol('switch_statement');
export const switchBody = symbol('switch_body');
export const switchClause = symbol('switch_clause');
export const caseClause = symbol('case_clause');
export const defaultAloneClause = symbol('default_alone_clause');
export const caseSelectors = symbol('case_selectors');
export const caseSelector = symbol('case_selector');
export const loopStatement = symbol('loop_statement');
export const forStatement = symbol('for_statement');
export const forHeader = symbol('for_header');
export const forInit = symbol('for_init');
export const forUpdate = symbol('for_update');
export const whileStatement = symbol('while_statement');
export const breakStatement = symbol('break_statement');
export const breakIfStatement = symbol('break_if_statement');
export const continueStatement = symbol('continue_statement');
export const continuingStatement = symbol('continuing_statement');
export const continuingCompoundStatement = symbol('continuing_compound_statement');
export const returnStatement = symbol('return_statement');
export const funcCallStatement = symbol('func_call_statement');
export const constAssertStatement = symbol('const_assert_statement');
export const statement = symbol('statement');
export const variableUpdatingStatement = symbol('variable_updating_statement');
export const functionDecl = symbol('function_decl');
export const functionHeader = symbol('function_header');
export const paramList = symbol('param_list');
export const param = symbol('param');
export const enableDirective = symbol('enable_directive');
export const enableExtensionList = symbol('enable_extension_list');
export const requiresDirective = symbol('requires_directive');
export const softwareExtensionList = symbol('software_extension_list');
export const enableExtensionName = symbol('enable_extension_name');
export const softwareExtensionName = symbol('software_extension_name');
export const identPatternToken = symbol('ident_pattern_token');
export const severityControlName = symbol('severity_control_name');
export const swizzleName = symbol('swizzle_name');
// IMPLEMENTATIONS
translationUnit.set(union(
sequence(star(globalDirective), star(globalDecl)),
));
globalDirective.set(union(
diagnosticDirective,
enableDirective,
requiresDirective,
));
globalDecl.set(union(
';',
sequence(globalVariableDecl, ';'),
sequence(globalValueDecl, ';'),
sequence(typeAliasDecl, ';'),
structDecl,
functionDecl,
sequence(constAssertStatement, ';'),
));
boolLiteral.set(union(
'true',
'false',
));
intLiteral.set(union(
decimalIntLiteral,
hexIntLiteral,
));
decimalIntLiteral.set(union(
/0[iu]?/,
/[1-9][0-9]*[iu]?/,
));
hexIntLiteral.set(union(
/0[xX][0-9a-fA-F]+[iu]?/,
));
floatLiteral.set(union(
decimalFloatLiteral,
hexFloatLiteral,
));
decimalFloatLiteral.set(union(
/0[fh]/,
/[1-9][0-9]*[fh]/,
/[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?/,
/[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?/,
/[0-9]+[eE][+-]?[0-9]+[fh]?/,
));
hexFloatLiteral.set(union(
/0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+([pP][+-]?[0-9]+[fh]?)?/,
/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*([pP][+-]?[0-9]+[fh]?)?/,
/0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?/,
));
diagnosticDirective.set(union(
sequence('diagnostic', diagnosticControl, ';'),
));
literal.set(union(
intLiteral,
floatLiteral,
boolLiteral,
));
ident.set(union(
identPatternToken,
));
memberIdent.set(union(
identPatternToken,
));
diagnosticNameToken.set(union(
identPatternToken,
));
diagnosticRuleName.set(union(
diagnosticNameToken,
sequence(diagnosticNameToken, '.', diagnosticNameToken),
));
templateList.set(union(
sequence(TEMPLATE_ARGS_START, templateArgCommaList, TEMPLATE_ARGS_END),
));
templateArgCommaList.set(union(
sequence(templateArgExpression, star(sequence(',', templateArgExpression)), maybe(',')),
));
templateArgExpression.set(union(
expression,
));
alignAttr.set(union(
sequence('@', 'align', '(', expression, maybe(','), ')'),
));
bindingAttr.set(union(
sequence('@', 'binding', '(', expression, maybe(','), ')'),
));
builtinAttr.set(union(
sequence('@', 'builtin', '(', builtinValueName, maybe(','), ')'),
));
builtinValueName.set(union(
identPatternToken,
));
constAttr.set(union(
sequence('@', 'const'),
));
diagnosticAttr.set(union(
sequence('@', 'diagnostic', diagnosticControl),
));
groupAttr.set(union(
sequence('@', 'group', '(', expression, maybe(','), ')'),
));
idAttr.set(union(
sequence('@', 'id', '(', expression, maybe(','), ')'),
));
interpolateAttr.set(union(
sequence('@', 'interpolate', '(', interpolateTypeName, maybe(','), ')'),
sequence('@', 'interpolate', '(', interpolateTypeName, ',', interpolateSamplingName, maybe(','), ')'),
));
interpolateTypeName.set(union(
identPatternToken,
));
interpolateSamplingName.set(union(
identPatternToken,
));
invariantAttr.set(union(
sequence('@', 'invariant'),
));
locationAttr.set(union(
sequence('@', 'location', '(', expression, maybe(','), ')'),
));
mustUseAttr.set(union(
sequence('@', 'must_use'),
));
sizeAttr.set(union(
sequence('@', 'size', '(', expression, maybe(','), ')'),
));
workgroupSizeAttr.set(union(
sequence('@', 'workgroup_size', '(', expression, maybe(','), ')'),
sequence('@', 'workgroup_size', '(', expression, ',', expression, maybe(','), ')'),
sequence('@', 'workgroup_size', '(', expression, ',', expression, ',', expression, maybe(','), ')'),
));
vertexAttr.set(union(
sequence('@', 'vertex'),
));
fragmentAttr.set(union(
sequence('@', 'fragment'),
));
computeAttr.set(union(
sequence('@', 'compute'),
));
attribute.set(union(
sequence('@', identPatternToken, maybe(argumentExpressionList)),
alignAttr,
bindingAttr,
builtinAttr,
constAttr,
diagnosticAttr,
groupAttr,
idAttr,
interpolateAttr,
invariantAttr,
locationAttr,
mustUseAttr,
sizeAttr,
workgroupSizeAttr,
vertexAttr,
fragmentAttr,
computeAttr,
));
diagnosticControl.set(union(
sequence('(', severityControlName, ',', diagnosticRuleName, maybe(','), ')'),
));
structDecl.set(union(
sequence('struct', ident, structBodyDecl),
));
structBodyDecl.set(union(
sequence('{', structMember, star(sequence(',', structMember)), maybe(','), '}'),
));
structMember.set(union(
sequence(star(attribute), memberIdent, ':', typeSpecifier),
));
typeAliasDecl.set(union(
sequence('alias', ident, '=', typeSpecifier),
));
typeSpecifier.set(union(
templateElaboratedIdent,
));
templateElaboratedIdent.set(union(
sequence(ident, maybe(templateList)),
));
variableOrValueStatement.set(union(
variableDecl,
sequence(variableDecl, '=', expression),
sequence('let', optionallyTypedIdent, '=', expression),
sequence('const', optionallyTypedIdent, '=', expression),
));
variableDecl.set(union(
sequence('var', maybe(templateList), optionallyTypedIdent),
));
optionallyTypedIdent.set(union(
sequence(ident, maybe(sequence(':', typeSpecifier))),
));
globalVariableDecl.set(union(
sequence(star(attribute), variableDecl, maybe(sequence('=', expression))),
));
globalValueDecl.set(union(
sequence('const', optionallyTypedIdent, '=', expression),
sequence(star(attribute), 'override', optionallyTypedIdent, maybe(sequence('=', expression))),
));
primaryExpression.set(union(
templateElaboratedIdent,
callExpression,
literal,
parenExpression,
));
callExpression.set(union(
callPhrase,
));
callPhrase.set(union(
sequence(templateElaboratedIdent, argumentExpressionList),
));
parenExpression.set(union(
sequence('(', expression, ')'),
));
argumentExpressionList.set(union(
sequence('(', maybe(expressionCommaList), ')'),
));
expressionCommaList.set(union(
sequence(expression, star(sequence(',', expression)), maybe(',')),
));
componentOrSwizzleSpecifier.set(union(
sequence('[', expression, ']', maybe(componentOrSwizzleSpecifier)),
sequence('.', memberIdent, maybe(componentOrSwizzleSpecifier)),
sequence('.', swizzleName, maybe(componentOrSwizzleSpecifier)),
));
unaryExpression.set(union(
singularExpression,
sequence('-', unaryExpression),
sequence('!', unaryExpression),
sequence('~', unaryExpression),
sequence('*', unaryExpression),
sequence('&', unaryExpression),
));
singularExpression.set(union(
sequence(primaryExpression, maybe(componentOrSwizzleSpecifier)),
));
lhsExpression.set(union(
sequence(coreLhsExpression, maybe(componentOrSwizzleSpecifier)),
sequence('*', lhsExpression),
sequence('&', lhsExpression),
));
coreLhsExpression.set(union(
ident,
sequence('(', lhsExpression, ')'),
));
multiplicativeExpression.set(union(
unaryExpression,
sequence(multiplicativeExpression, multiplicativeOperator, unaryExpression),
));
multiplicativeOperator.set(union(
'*',
'/',
'%',
));
additiveExpression.set(union(
multiplicativeExpression,
sequence(additiveExpression, additiveOperator, multiplicativeExpression),
));
additiveOperator.set(union(
'+',
'-',
));
shiftExpression.set(union(
additiveExpression,
sequence(unaryExpression, SHIFT_LEFT, unaryExpression),
sequence(unaryExpression, SHIFT_RIGHT, unaryExpression),
));
relationalExpression.set(union(
shiftExpression,
sequence(shiftExpression, LESS_THAN, shiftExpression),
sequence(shiftExpression, GREATER_THAN, shiftExpression),
sequence(shiftExpression, LESS_THAN_EQUAL, shiftExpression),
sequence(shiftExpression, GREATER_THAN_EQUAL, shiftExpression),
sequence(shiftExpression, '==', shiftExpression),
sequence(shiftExpression, '!=', shiftExpression),
));
shortCircuitAndExpression.set(union(
relationalExpression,
sequence(shortCircuitAndExpression, '&&', relationalExpression),
));
shortCircuitOrExpression.set(union(
relationalExpression,
sequence(shortCircuitOrExpression, '||', relationalExpression),
));
binaryOrExpression.set(union(
unaryExpression,
sequence(binaryOrExpression, '|', unaryExpression),
));
binaryAndExpression.set(union(
unaryExpression,
sequence(binaryAndExpression, '&', unaryExpression),
));
binaryXorExpression.set(union(
unaryExpression,
sequence(binaryXorExpression, '^', unaryExpression),
));
bitwiseExpression.set(union(
binaryAndExpression,
binaryOrExpression,
binaryXorExpression,
));
expression.set(union(
relationalExpression,
shortCircuitOrExpression,
shortCircuitAndExpression,
bitwiseExpression,
));
compoundStatement.set(union(
sequence(star(attribute), '{', star(statement), '}'),
));
assignmentStatement.set(union(
sequence(lhsExpression, '=', expression),
sequence(lhsExpression, compoundAssignmentOperator, expression),
sequence('_', '=', expression),
));
compoundAssignmentOperator.set(union(
'+=',
'-=',
'*=',
'/=',
'%=',
'&=',
'|=',
'^=',
SHIFT_RIGHT_ASSIGN,
SHIFT_LEFT_ASSIGN,
));
incrementStatement.set(union(
sequence(lhsExpression, '++'),
));
decrementStatement.set(union(
sequence(lhsExpression, '--'),
));
ifStatement.set(union(
sequence(star(attribute), ifClause, star(elseIfClause), maybe(elseClause)),
));
ifClause.set(union(
sequence('if', expression, compoundStatement),
));
elseIfClause.set(union(
sequence('else', 'if', expression, compoundStatement),
));
elseClause.set(union(
sequence('else', compoundStatement),
));
switchStatement.set(union(
sequence(star(attribute), 'switch', expression, switchBody),
));
switchBody.set(union(
sequence(star(attribute), '{', switchClause, '}'),
));
switchClause.set(union(
caseClause,
defaultAloneClause,
));
caseClause.set(union(
sequence('case', caseSelectors, maybe(':'), compoundStatement),
));
defaultAloneClause.set(union(
sequence('default', maybe(':'), compoundStatement),
));
caseSelectors.set(union(
sequence(caseSelector, star(sequence(',', caseSelector)), maybe(',')),
));
caseSelector.set(union(
'default',
expression,
));
loopStatement.set(union(
sequence(star(attribute), 'loop', star(attribute), '{', star(statement), maybe(continuingStatement), '}'),
));
forStatement.set(union(
sequence(star(attribute), 'for', '(', forHeader, ')', compoundStatement),
));
forHeader.set(union(
sequence(maybe(forInit), ';', maybe(expression), ';', maybe(forUpdate)),
));
forInit.set(union(
variableOrValueStatement,
variableUpdatingStatement,
funcCallStatement,
));
forUpdate.set(union(
variableUpdatingStatement,
funcCallStatement,
));
whileStatement.set(union(
sequence(star(attribute), 'while', expression, compoundStatement),
));
breakStatement.set(union(
'break',
));
breakIfStatement.set(union(
sequence('break', 'if', expression, ';'),
));
continueStatement.set(union(
'continue',
));
continuingStatement.set(union(
sequence('continuing', continuingCompoundStatement),
));
continuingCompoundStatement.set(union(
sequence(star(attribute), '{', star(statement), maybe(breakIfStatement), '}'),
));
returnStatement.set(union(
sequence('return', maybe(expression)),
));
funcCallStatement.set(union(
callPhrase,
));
constAssertStatement.set(union(
sequence('const_assert', expression),
));
statement.set(union(
';',
sequence(returnStatement, ';'),
ifStatement,
switchStatement,
loopStatement,
forStatement,
whileStatement,
sequence(funcCallStatement, ';'),
sequence(variableOrValueStatement, ';'),
sequence(breakStatement, ';'),
sequence(continueStatement, ';'),
sequence('discard', ';'),
sequence(variableUpdatingStatement, ';'),
compoundStatement,
sequence(constAssertStatement, ';'),
));
variableUpdatingStatement.set(union(
assignmentStatement,
incrementStatement,
decrementStatement,
));
functionDecl.set(union(
sequence(star(attribute), functionHeader, compoundStatement),
));
functionHeader.set(union(
sequence('fn', ident, '(', maybe(paramList), ')', maybe(sequence('->', star(attribute), templateElaboratedIdent))),
));
paramList.set(union(
sequence(param, star(sequence(',', param)), maybe(',')),
));
param.set(union(
sequence(star(attribute), ident, ':', typeSpecifier),
));
enableDirective.set(union(
sequence('enable', enableExtensionList, ';'),
));
enableExtensionList.set(union(
sequence(enableExtensionName, star(sequence(',', enableExtensionName)), maybe(',')),
));
requiresDirective.set(union(
sequence('requires', softwareExtensionList, ';'),
));
softwareExtensionList.set(union(
sequence(softwareExtensionName, star(sequence(',', softwareExtensionName)), maybe(',')),
));
enableExtensionName.set(union(
identPatternToken,
));
softwareExtensionName.set(union(
identPatternToken,
));
identPatternToken.set(union(
/([_\p{XID_Start}][\p{XID_Continue}]+)|([\p{XID_Start}])/u,
));
severityControlName.set(union(
identPatternToken,
));
swizzleName.set(union(
/[rgba]/,
/[rgba][rgba]/,
/[rgba][rgba][rgba]/,
/[rgba][rgba][rgba][rgba]/,
/[xyzw]/,
/[xyzw][xyzw]/,
/[xyzw][xyzw][xyzw]/,
/[xyzw][xyzw][xyzw][xyzw]/,
));
// DECLARATIONS
export const translationUnitExtended = symbol('translation_unit_extended');
export const globalDirectiveExtended = symbol('global_directive_extended');
export const importDirective = symbol('import_directive');
export const importPath = symbol('import_path');
export const translationUnitImport = symbol('translation_unit_import');
export const globalDirectiveImport = symbol('global_directive_import');
// IMPLEMENTATIONS
translationUnitExtended.set(union(
sequence(star(globalDirectiveExtended), star(globalDecl)),
));
globalDirectiveExtended.set(union(
diagnosticDirective,
enableDirective,
requiresDirective,
importDirective,
));
importDirective.set(union(
sequence('import', importPath, ';'),
));
importPath.set(union(
/"[^*"<>:|?\\]+"/,
));
translationUnitImport.set(union(
sequence(star(globalDirectiveImport), star(globalDecl)),
));
globalDirectiveImport.set(union(
importDirective,
));