walt-compiler
Version:
Alternative syntax for WebAssembly text format
1 lines • 111 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.Walt={})}(this,function(exports){"use strict";function extend(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var r in n)hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}function map(e){function t(n){if(!Array.isArray(n))throw new Error("Transform must be used on an Array. Received "+JSON.stringify(n));const r=(()=>{const[t]=n;if(t.Type in e&&"function"==typeof e[t.Type])return e[t.Type];return identity})();if(2===r.length)return r(n,t);const[o,...s]=r(n),i=o.params.filter(Boolean).map(e=>t([e,...s]));return immutable(o,{params:i})}return t}function mapNode$2(e){const t=n=>{if(null==n)return n;const r=(()=>{if("*"in e&&"function"==typeof e["*"])return e["*"];if(n.Type in e&&"function"==typeof e[n.Type])return e[n.Type];return identity})();if(2===r.length)return r(n,t);const o=r(n);const s=o.params.map(t);return immutable(o,{params:s})};return t}function unwrapExports(e){return e&&e.__esModule?e.default:e}function createCommonjsModule(e,t){return t={exports:{}},e(t,t.exports),t.exports}function id(e){return e[0]}function grammar(){const e=this.lexer,t=this.Syntax,{extendNode:n,drop:r,nth:o,nuller:s,nonEmpty:i,add:a,flatten:c,compose:u}=this.helpers,{node:p,binary:l,constant:m,identifier:d,statement:_,unary:f,ternary:y,subscript:x,access:S,fun:h,declaration:T,call:g,struct:E,result:b,string:v,char:A,typedef:N,voidFun:L,type:I,arrayType:O,assignment:C,forLoop:w,whileLoop:R,typeGeneric:P,spread:B,builtinDecl:k,assignmentExpr:D,addressOf:F}=this.nodes(e);return{Lexer:e,ParserRules:[{name:"_$ebnf$1",symbols:[]},{name:"_$ebnf$1",symbols:["_$ebnf$1","wschar"],postprocess:function(e){return e[0].concat([e[1]])}},{name:"_",symbols:["_$ebnf$1"],postprocess:function(e){return null}},{name:"__$ebnf$1",symbols:["wschar"]},{name:"__$ebnf$1",symbols:["__$ebnf$1","wschar"],postprocess:function(e){return e[0].concat([e[1]])}},{name:"__",symbols:["__$ebnf$1"],postprocess:function(e){return null}},{name:"wschar",symbols:[/[ \t\n\v\f]/],postprocess:id},{name:"Struct",symbols:["TYPE","__","Identifier","_","EQUALS","_","Union","SEPARATOR"],postprocess:E},{name:"Struct",symbols:["TYPE","__","Identifier","_","EQUALS","_","NativeType","SEPARATOR"],postprocess:E},{name:"Union",symbols:["StructDefinition"],postprocess:id},{name:"Union",symbols:["StructDefinition","_","OR","_","Union"],postprocess:p(t.UnionType)},{name:"StructDefinition",symbols:["ArrayType"],postprocess:id},{name:"StructDefinition",symbols:["Identifier"],postprocess:id},{name:"StructDefinition",symbols:["LCB","_","StructBody","_","RCB"],postprocess:u(p(t.ObjectLiteral),c)},{name:"StructBody",symbols:["StructNameAndType"],postprocess:id},{name:"StructBody",symbols:["StructNameAndType","_","COMMA","_","StructBody"],postprocess:c},{name:"StructNameAndType",symbols:["Identifier","_","COLON","_","Type"],postprocess:p(t.Pair)},{name:"StructNameAndType",symbols:["AddressOf","_","COLON","_","Type"],postprocess:p(t.Pair)},{name:"AddressOf",symbols:["AND","Identifier"],postprocess:F},{name:"TypeDef",symbols:["TYPE","__","Identifier","_","EQUALS","_","TypeDefinition","_","FATARROW","_","Type","_","SEPARATOR"],postprocess:u(N)},{name:"TypeDefinition",symbols:["LB","_","TypeList","_","RB"],postprocess:c},{name:"TypeDefinition",symbols:["LB","_","RB"],postprocess:c},{name:"TypeList",symbols:["Type"],postprocess:id},{name:"TypeList",symbols:["Type","_","COMMA","_","TypeList"],postprocess:c},{name:"_Type",symbols:["NativeType"],postprocess:id},{name:"_Type",symbols:["GenericType"],postprocess:id},{name:"_Type",symbols:["Identifier"],postprocess:id},{name:"ArrayType",symbols:["_Type","_","LSB","_","RSB"],postprocess:O},{name:"Type",symbols:["_Type"],postprocess:id},{name:"Type",symbols:["ArrayType"],postprocess:id},{name:"GenericType",symbols:["Identifier","LT","_","StaticObjectLiteral","_","GT"],postprocess:P},{name:"StaticObjectLiteral",symbols:["LCB","_","RCB"],postprocess:u(p(t.ObjectLiteral))},{name:"StaticObjectLiteral",symbols:["LCB","_","StaticPropertyList","_","RCB"],postprocess:u(p(t.ObjectLiteral),c)},{name:"StaticPropertyValue",symbols:["Number"],postprocess:id},{name:"StaticPropertyValue",symbols:["Boolean"],postprocess:id},{name:"StaticPropertyValue",symbols:["StringLiteral"],postprocess:id},{name:"StaticProperty",symbols:["Identifier","_","COLON","_","StaticPropertyValue"],postprocess:p(t.Pair)},{name:"StaticPropertyList",symbols:["StaticProperty"],postprocess:id},{name:"StaticPropertyList",symbols:["StaticProperty","_","COMMA","_","StaticPropertyList"],postprocess:c},{name:"ObjectLiteral",symbols:["LCB","_","RCB"],postprocess:p(t.ObjectLiteral)},{name:"ObjectLiteral",symbols:["LCB","_","PropertyList","_","RCB"],postprocess:u(p(t.ObjectLiteral),c)},{name:"PropertyList",symbols:["Property"],postprocess:id},{name:"PropertyList",symbols:["Property","_","COMMA","_","PropertyList"],postprocess:c},{name:"Property",symbols:["Identifier","_","COLON","_","Ternary"],postprocess:p(t.Pair)},{name:"Property",symbols:["SPREAD","Identifier"],postprocess:B},{name:"Property",symbols:["Identifier"],postprocess:id},{name:"Import",symbols:["IMPORT","_","ImportDefinition","__","FROM","__","StringLiteral","_","SEPARATOR"],postprocess:p(t.Import)},{name:"ImportDefinition",symbols:["LCB","_","ImportAndTypeList","_","RCB"],postprocess:u(p(t.ObjectLiteral),c)},{name:"ImportAndTypeList",symbols:["ImportName"],postprocess:id},{name:"ImportAndTypeList",symbols:["ImportAndType"],postprocess:id},{name:"ImportAndTypeList",symbols:["ImportName","_","COMMA","_","ImportAndTypeList"],postprocess:c},{name:"ImportAndTypeList",symbols:["ImportAndType","_","COMMA","_","ImportAndTypeList"],postprocess:c},{name:"ImportAndType",symbols:["ImportName","_","COLON","_","Type"],postprocess:p(t.Pair)},{name:"ImportAndType",symbols:["ImportName","_","AS","_","Identifier"],postprocess:p(t.BinaryExpression,{value:"as"})},{name:"ImportAndType",symbols:["ImportAndType","_","AS","_","Identifier"],postprocess:p(t.BinaryExpression,{value:"as"})},{name:"ImportName",symbols:["Identifier"],postprocess:id},{name:"If",symbols:["IF","_","LB","_","Expression","_","RB","_","BranchBody"],postprocess:p(t.IfThenElse)},{name:"If",symbols:["IF","_","LB","_","Expression","_","RB","_","BranchBody","_","Else"],postprocess:p(t.IfThenElse)},{name:"Else",symbols:["ELSE","_","BranchBody"],postprocess:p(t.Else)},{name:"BranchBody",symbols:["Statement"],postprocess:id},{name:"BranchBody",symbols:["Block"],postprocess:id},{name:"For",symbols:["FOR","_","LB","_","ForArg","_","SEPARATOR","_","Expression","_","SEPARATOR","_","ForArg","_","RB","_","BranchBody"],postprocess:w},{name:"ForArg",symbols:["_Assignment"],postprocess:id},{name:"ForArg",symbols:["Ternary"],postprocess:id},{name:"While",symbols:["WHILE","_","LB","_","Expression","_","RB","_","BranchBody"],postprocess:R},{name:"Break",symbols:["BREAK","_","SEPARATOR"],postprocess:p(t.Break)},{name:"Program",symbols:["_"],postprocess:u(p("Program",{value:"ROOT_NODE"}),c)},{name:"Program",symbols:["_","SourceElementList","_"],postprocess:u(p("Program",{value:"ROOT_NODE"}),c)},{name:"SourceElementList",symbols:["SourceElement"],postprocess:c},{name:"SourceElementList",symbols:["SourceElement","_","SourceElementList"],postprocess:u(r,c,c)},{name:"SourceElement",symbols:["Function"],postprocess:id},{name:"SourceElement",symbols:["GlobalDeclaration"],postprocess:id},{name:"SourceElement",symbols:["GlobalImmutableDeclaration"],postprocess:id},{name:"SourceElement",symbols:["StaticDeclaration"],postprocess:id},{name:"SourceElement",symbols:["Struct"],postprocess:id},{name:"SourceElement",symbols:["TypeDef"],postprocess:id},{name:"SourceElement",symbols:["Export"],postprocess:id},{name:"SourceElement",symbols:["Import"],postprocess:id},{name:"Statement",symbols:["ExpressionStatement"],postprocess:id},{name:"Statement",symbols:["Declaration"],postprocess:id},{name:"Statement",symbols:["ImmutableDeclaration"],postprocess:id},{name:"Statement",symbols:["Assignment"],postprocess:id},{name:"Statement",symbols:["If"],postprocess:id},{name:"Statement",symbols:["For"],postprocess:id},{name:"Statement",symbols:["While"],postprocess:id},{name:"Statement",symbols:["Break"],postprocess:id},{name:"Statement",symbols:["Unreachable"],postprocess:id},{name:"Statement",symbols:["ReturnStatement"],postprocess:id},{name:"Block",symbols:["LCB","_","RCB"],postprocess:p(t.Block)},{name:"Block",symbols:["LCB","_","StatementList","_","RCB"],postprocess:u(p(t.Block),c)},{name:"StatementList",symbols:["Statement"],postprocess:r},{name:"StatementList",symbols:["Statement","_","StatementList"],postprocess:c},{name:"Function",symbols:["FUNCTION","__","Identifier","_","FunctionParameters","_","Block"],postprocess:L},{name:"Function",symbols:["FUNCTION","__","Identifier","_","FunctionParameters","_","FunctionResult","_","Block"],postprocess:h},{name:"FunctionParameters",symbols:["LB","_","RB"],postprocess:p(t.FunctionArguments)},{name:"FunctionParameters",symbols:["LB","_","ParameterList","_","RB"],postprocess:u(p(t.FunctionArguments),c,c)},{name:"ParameterList",symbols:["NameAndType"],postprocess:id},{name:"ParameterList",symbols:["NameAndType","_","COMMA","_","ParameterList"],postprocess:c},{name:"NameAndType",symbols:["Identifier","_","COLON","_","DeclType"],postprocess:p(t.Pair)},{name:"DeclType",symbols:["Type"],postprocess:u(n({Type:t.DeclType}),o(0))},{name:"FunctionResult",symbols:["COLON","_","Type"],postprocess:u(b,r)},{name:"GlobalDeclaration",symbols:["LET","_","NameAndType","_","SEPARATOR"],postprocess:T(t.Declaration)},{name:"GlobalDeclaration",symbols:["LET","_","NameAndType","_","EQUALS","_","Atom","_","SEPARATOR"],postprocess:T(t.Declaration)},{name:"GlobalImmutableDeclaration",symbols:["CONST","_","Identifier","_","COLON","_","GenericType","_","SEPARATOR"],postprocess:k},{name:"GlobalImmutableDeclaration",symbols:["CONST","_","NameAndType","_","EQUALS","_","ObjectLiteral","_","SEPARATOR"],postprocess:T(t.ImmutableDeclaration)},{name:"GlobalImmutableDeclaration",symbols:["CONST","_","NameAndType","_","EQUALS","_","Atom","_","SEPARATOR"],postprocess:T(t.ImmutableDeclaration)},{name:"Declaration",symbols:["LET","_","NameAndType","_","EQUALS","_","Expression","_","SEPARATOR"],postprocess:T(t.Declaration)},{name:"Declaration",symbols:["LET","_","NameAndType","_","SEPARATOR"],postprocess:T(t.Declaration)},{name:"ImmutableDeclaration",symbols:["CONST","_","NameAndType","_","EQUALS","_","Expression","_","SEPARATOR"],postprocess:T(t.ImmutableDeclaration)},{name:"ImmutableDeclaration",symbols:["CONST","_","NameAndType","_","EQUALS","_","ObjectLiteral","_","SEPARATOR"],postprocess:T(t.ImmutableDeclaration)},{name:"ImmutableDeclaration",symbols:["CONST","_","Identifier","_","COLON","_","GenericType","_","SEPARATOR"],postprocess:k},{name:"StaticNameAndType",symbols:["Identifier","_","COLON","_","ArrayType"],postprocess:p(t.Pair)},{name:"StaticDeclaration",symbols:["CONST","_","StaticNameAndType","_","EQUALS","_","LSB","_","RSB","_","SEPARATOR"],postprocess:T(t.StaticDeclaration)},{name:"StaticDeclaration",symbols:["CONST","_","StaticNameAndType","_","EQUALS","_","LSB","_","StaticValueList","_","RSB","_","SEPARATOR"],postprocess:u(T(t.StaticDeclaration),c)},{name:"StaticValueList",symbols:["Atom"],postprocess:id},{name:"StaticValueList",symbols:["Atom","_","COMMA","_","StaticValueList"],postprocess:c},{name:"Unreachable",symbols:["THROW","_","SEPARATOR"],postprocess:p(t.Unreachable)},{name:"Unreachable",symbols:["THROW","_","Expression","_","SEPARATOR"],postprocess:p(t.Unreachable)},{name:"Pair",symbols:["Identifier","_","COLON","_","Identifier"],postprocess:p(t.Pair)},{name:"Export",symbols:["EXPORT","__","ImmutableDeclaration"],postprocess:p(t.Export,{value:"export"})},{name:"Export",symbols:["EXPORT","__","Function"],postprocess:p(t.Export,{value:"export"})},{name:"Export",symbols:["EXPORT","__","TypeDef"],postprocess:p(t.Export,{value:"export"})},{name:"Export",symbols:["EXPORT","__","Struct"],postprocess:p(t.Export,{value:"export"})},{name:"ReturnStatement",symbols:["RETURN","__","Expression","_","SEPARATOR"],postprocess:p(t.ReturnStatement)},{name:"ReturnStatement$subexpression$1",symbols:[{literal:";"}],postprocess:s},{name:"ReturnStatement",symbols:["RETURN","ReturnStatement$subexpression$1"],postprocess:p(t.ReturnStatement)},{name:"Assignment",symbols:["_Assignment","_","SEPARATOR"],postprocess:id},{name:"_Assignment",symbols:["Subscript","_","EQUALS","_","Expression"],postprocess:e=>C(e,"=")},{name:"_Assignment",symbols:["Subscript","_","PLSEQUALS","_","Expression"],postprocess:e=>C(e,"+=")},{name:"_Assignment",symbols:["Subscript","_","MINEQUALS","_","Expression"],postprocess:e=>C(e,"-=")},{name:"_Assignment",symbols:["Subscript","_","EQUALS","_","ObjectLiteral"],postprocess:e=>C(e,"=")},{name:"ExpressionStatement",symbols:["Call","_","SEPARATOR"],postprocess:id},{name:"Expression",symbols:["AssignmentExpression"],postprocess:id},{name:"AssignmentExpression",symbols:["Identifier","_","EQUALS","_","Ternary"],postprocess:e=>D(e,"=")},{name:"AssignmentExpression",symbols:["Identifier","_","PLSEQUALS","_","Ternary"],postprocess:e=>D(e,"+=")},{name:"AssignmentExpression",symbols:["Identifier","_","MINEQUALS","_","Ternary"],postprocess:e=>D(e,"-=")},{name:"AssignmentExpression",symbols:["Ternary"],postprocess:id},{name:"Ternary",symbols:["Ternary","_","QUESTION","_","TernaryPair"],postprocess:y},{name:"Ternary",symbols:["Binary"],postprocess:id},{name:"TernaryPair",symbols:["Expression","_","COLON","_","Expression"],postprocess:p(t.Pair)},{name:"Binary",symbols:["Logical"],postprocess:id},{name:"Logical",symbols:["Logical","_",{literal:"||"},"_","Bitwise"],postprocess:l},{name:"Logical",symbols:["Logical","_",{literal:"&&"},"_","Bitwise"],postprocess:l},{name:"Logical",symbols:["Bitwise"],postprocess:id},{name:"Bitwise",symbols:["Bitwise","_",{literal:"|"},"_","Sum"],postprocess:l},{name:"Bitwise",symbols:["Bitwise","_",{literal:"^"},"_","Sum"],postprocess:l},{name:"Bitwise",symbols:["Bitwise","_",{literal:"&"},"_","Sum"],postprocess:l},{name:"Bitwise",symbols:["Equality"],postprocess:id},{name:"Equality",symbols:["Equality","_",{literal:"=="},"_","Comparison"],postprocess:l},{name:"Equality",symbols:["Equality","_",{literal:"!="},"_","Comparison"],postprocess:l},{name:"Equality",symbols:["Comparison"],postprocess:id},{name:"Comparison",symbols:["Comparison","_",{literal:"<"},"_","Shift"],postprocess:l},{name:"Comparison",symbols:["Comparison","_",{literal:">"},"_","Shift"],postprocess:l},{name:"Comparison",symbols:["Comparison","_",{literal:"<="},"_","Shift"],postprocess:l},{name:"Comparison",symbols:["Comparison","_",{literal:">="},"_","Shift"],postprocess:l},{name:"Comparison",symbols:["Shift"],postprocess:id},{name:"Shift",symbols:["Shift","_",{literal:">>"},"_","Sum"],postprocess:l},{name:"Shift",symbols:["Shift","_",{literal:"<<"},"_","Sum"],postprocess:l},{name:"Shift",symbols:["Shift","_",{literal:">>>"},"_","Sum"],postprocess:l},{name:"Shift",symbols:["Sum"],postprocess:id},{name:"Sum",symbols:["Sum","_",{literal:"+"},"_","Product"],postprocess:l},{name:"Sum",symbols:["Sum","_",{literal:"-"},"_","Product"],postprocess:l},{name:"Sum",symbols:["Product"],postprocess:id},{name:"Product",symbols:["Product","_",{literal:"*"},"_","Typecast"],postprocess:l},{name:"Product",symbols:["Product","_",{literal:"/"},"_","Typecast"],postprocess:l},{name:"Product",symbols:["Product","_",{literal:"%"},"_","Typecast"],postprocess:l},{name:"Product",symbols:["Typecast"],postprocess:id},{name:"Typecast",symbols:["Expression","_","COLON","_","DeclType"],postprocess:p(t.Pair)},{name:"Typecast",symbols:["Expression","_","AS","_","DeclType"],postprocess:p(t.Pair)},{name:"Typecast",symbols:["Unary"],postprocess:id},{name:"Unary",symbols:[{literal:"!"},"Call"],postprocess:f},{name:"Unary",symbols:[{literal:"~"},"Call"],postprocess:f},{name:"Unary",symbols:[{literal:"-"},"Call"],postprocess:f},{name:"Unary",symbols:[{literal:"+"},"Call"],postprocess:f},{name:"Unary",symbols:[{literal:"++"},"Call"],postprocess:f},{name:"Unary",symbols:[{literal:"--"},"Call"],postprocess:f},{name:"Unary",symbols:["Call"],postprocess:id},{name:"Call",symbols:["Subscript","_","LB","_","ArgumentList","_","RB"],postprocess:u(g,c)},{name:"Call",symbols:["Subscript","_","LB","_","RB"],postprocess:g},{name:"Call",symbols:["Subscript"],postprocess:id},{name:"ArgumentList",symbols:["Expression"],postprocess:id},{name:"ArgumentList",symbols:["NativeType"],postprocess:id},{name:"ArgumentList",symbols:["Expression","_","COMMA","_","ArgumentList"],postprocess:c},{name:"Subscript",symbols:["Access","LSB","_","Expression","_","RSB","Subscript"],postprocess:x},{name:"Subscript",symbols:["Access","LSB","_","Expression","_","RSB"],postprocess:x},{name:"Subscript",symbols:["Access"],postprocess:id},{name:"Access",symbols:["Access","DOT","Identifier"],postprocess:u(S,r)},{name:"Access",symbols:["NativeType","DOT","Access"],postprocess:u(S,r)},{name:"Access",symbols:["Grouping"],postprocess:id},{name:"Grouping",symbols:["LB","_","Expression","_","RB"],postprocess:o(2)},{name:"Grouping",symbols:["Atom"],postprocess:id},{name:"Atom",symbols:["Identifier"],postprocess:id},{name:"Atom",symbols:["StringLiteral"],postprocess:id},{name:"Atom",symbols:["CharacterLiteral"],postprocess:id},{name:"Atom",symbols:["Number"],postprocess:id},{name:"NativeType",symbols:[e.has("type")?{type:"type"}:I],postprocess:I},{name:"Identifier",symbols:[e.has("identifier")?{type:"identifier"}:d],postprocess:d},{name:"Number",symbols:[e.has("number")?{type:"number"}:number],postprocess:m},{name:"StringLiteral",symbols:[e.has("string")?{type:"string"}:v],postprocess:v},{name:"CharacterLiteral",symbols:[e.has("char")?{type:"char"}:A],postprocess:A},{name:"word",symbols:[/[a-zA-Z_]/],postprocess:id},{name:"word",symbols:["word",/[a-zA-Z0-9_]/],postprocess:a},{name:"digit",symbols:[/[0-9]/],postprocess:id},{name:"digit",symbols:["digit",/[0-9]/],postprocess:a},{name:"SEPARATOR",symbols:["_",{literal:";"}],postprocess:s},{name:"QUESTION",symbols:[{literal:"?"}],postprocess:s},{name:"COMMA",symbols:[{literal:","}],postprocess:s},{name:"AND",symbols:[{literal:"&"}],postprocess:s},{name:"DOT",symbols:[{literal:"."}],postprocess:s},{name:"LB",symbols:[{literal:"("}],postprocess:s},{name:"RB",symbols:[{literal:")"}],postprocess:s},{name:"LSB",symbols:[{literal:"["}],postprocess:s},{name:"RSB",symbols:[{literal:"]"}],postprocess:s},{name:"LCB",symbols:[{literal:"{"}],postprocess:s},{name:"RCB",symbols:[{literal:"}"}],postprocess:s},{name:"OR",symbols:[{literal:"|"}],postprocess:s},{name:"COLON",symbols:[{literal:":"}],postprocess:s},{name:"EQUALS",symbols:[{literal:"="}],postprocess:s},{name:"PLSEQUALS",symbols:[{literal:"+="}],postprocess:s},{name:"MINEQUALS",symbols:[{literal:"-="}],postprocess:s},{name:"GT",symbols:[{literal:">"}],postprocess:s},{name:"LT",symbols:[{literal:"<"}],postprocess:s},{name:"FATARROW",symbols:[{literal:"=>"}],postprocess:s},{name:"SPREAD",symbols:[{literal:"..."}],postprocess:s},{name:"FUNCTION",symbols:[{literal:"function"}],postprocess:s},{name:"LET",symbols:[{literal:"let"}],postprocess:s},{name:"CONST",symbols:[{literal:"const"}],postprocess:s},{name:"EXPORT",symbols:[{literal:"export"}],postprocess:s},{name:"IMPORT",symbols:[{literal:"import"}],postprocess:s},{name:"AS",symbols:[{literal:"as"}],postprocess:s},{name:"FROM",symbols:[{literal:"from"}],postprocess:s},{name:"RETURN",symbols:[{literal:"return"}],postprocess:s},{name:"TYPE",symbols:[{literal:"type"}],postprocess:s},{name:"IF",symbols:[{literal:"if"}],postprocess:s},{name:"ELSE",symbols:[{literal:"else"}],postprocess:s},{name:"FOR",symbols:[{literal:"for"}],postprocess:s},{name:"WHILE",symbols:[{literal:"while"}],postprocess:s},{name:"SWITCH",symbols:[{literal:"switch"}],postprocess:s},{name:"DO",symbols:[{literal:"do"}],postprocess:s},{name:"THROW",symbols:[{literal:"throw"}],postprocess:s},{name:"BREAK",symbols:[{literal:"break"}],postprocess:s}],ParserStart:"Program"}}function id$1(e){return e[0]}function grammar$1(){const e=this.Syntax,{flatten:t}=this.helpers,{node:n}=this.nodes(this.lexer);return{Lexer:void 0,ParserRules:[{name:"TypeList",symbols:["DefaultArgument"],postprocess:id$1},{name:"TypeList",symbols:["DefaultArgument","_","COMMA","_","TypeList"],postprocess:t},{name:"DefaultArgument",symbols:["Type","_","EQUALS","_","Atom"],postprocess:n(e.Assignment)},{name:"ParameterList",symbols:["DefaultFunctionArgument"],postprocess:id$1},{name:"ParameterList",symbols:["DefaultFunctionArgument","_","COMMA","_","ParameterList"],postprocess:t},{name:"DefaultFunctionArgument",symbols:["NameAndType","_","EQUALS","_","Atom"],postprocess:n(e.Assignment)}],ParserStart:"TypeList"}}function factory(e){const t=(t,n={})=>r=>{const o=r.filter(nonEmpty);const{value:s="",meta:i={}}=n;const a=marker(e);const c=o[o.length-1]&&o[o.length-1].range?o[o.length-1].range[1]:_extends({},a,{col:a.col+s.length});return{value:s,type:null,Type:t,toString(){},meta:i,range:[a,c],params:o}},n=e=>{const[n,r,o]=e.filter(nonEmpty);let s=Syntax.BinaryExpression;"||"!==r.value&&"&&"!==r.value||(s=Syntax.Select);return t(s,{value:r.value})([n,o])},r=e=>{const[n]=drop(e);return extendNode({type:null!=n&&"void"!==n.value?n.value:null},t(Syntax.FunctionResult)(e))};return{node:t,binary:n,constant:e=>{const n=e[0].value;return extendNode({value:`${n}`,type:-1!==n.toString().indexOf(".")?"f32":"i32"},t(Syntax.Constant)([]))},identifier:e=>t("Identifier",{value:e.join("")})([]),unary:([e,n])=>{let r=[n];"-"===e.value&&(r=[_extends({},n,{value:"0",Type:Syntax.Constant,params:[],meta:{}}),n]);return extendNode({value:e.value,params:r},t(Syntax.UnaryExpression)([e,n]))},ternary:e=>extendNode({value:"?"},t(Syntax.TernaryExpression)(e)),subscript:e=>{const[n,r]=e.filter(nonEmpty);return extendNode({value:n.value,params:[n,r]},t(Syntax.ArraySubscript)([n,r]))},access(e){return extendNode({value:e[0].value+"."+e[1].value},t(Syntax.Access)(e))},fun:e=>{const[t,n,r,o]=e.filter(nonEmpty);return _extends({},t,{Type:Syntax.FunctionDeclaration,meta:[],params:[n,r,o]})},declaration:e=>n=>{const[r,...o]=drop(n);const[s,i]=r.params;return extendNode({value:s.value,type:i.value},t(e)(o))},call:e=>{let[n,...r]=drop(e);return extendNode({value:n.value},t(Syntax.FunctionCall)([n,...r]))},struct:e=>{const[n,...r]=drop(e);return extendNode({value:n.value},t(Syntax.Struct)(r))},result:r,string:e=>extendNode({value:e[0].value,type:"i32"},t(Syntax.StringLiteral)([])),char(e){return extendNode({value:e[0].value,type:"i32"},t(Syntax.CharacterLiteral)([]))},type(e){return extendNode({value:e[0].value,type:e[0].value,params:[]},t(Syntax.Type)(e))},arrayType(e){const n=drop(e)[0];return extendNode({value:n.value+"[]",type:n.type+"[]",params:[]},t(Syntax.ArrayType)(e))},typeGeneric(e){const[n,r]=drop(e);return extendNode({value:n.value,type:n.value,params:[r]},t(Syntax.Type)(e))},typedef:e=>{const[n,o,s]=drop(e);return extendNode({value:n.value,params:[t(Syntax.FunctionArguments)(o),extendNode({type:s.value},t(Syntax.FunctionResult)([s]))],type:s.type},t(Syntax.Typedef)([n,o,r]))},voidFun:e=>{const n=drop(e);const[r,o,s]=n;const i=extendNode({type:null},t(Syntax.FunctionResult)([]));return extendNode({value:r.value,params:[o,i,s]},t(Syntax.FunctionDeclaration)(n))},assignment(e,r){if(["-=","+="].includes(r)){const o=r[0],[s,i]=drop(e),a=n([s,{value:o},i]);return t(Syntax.Assignment,{value:"="})([s,a])}return t(Syntax.Assignment,{value:r})(e)},assignmentExpr(e,r){if(["-=","+="].includes(r)){const o=r[0],[s,i]=drop(e),a=n([s,{value:o},i]);return t(Syntax.AssignmentExpression,{value:"="})([s,a])}return t(Syntax.AssignmentExpression,{value:r})(e)},forLoop(e){const[n,r,o,...s]=drop(e);return t(Syntax.Loop)([n,r,...s,o])},whileLoop(e){const n=t(Syntax.Noop)([]);return t(Syntax.Loop)([n,...e])},spread(e){return t(Syntax.Spread)(e)},builtinDecl(e){const[n,r]=drop(e);return extendNode({value:n.value,type:r.value,params:[r]},t(Syntax.ImmutableDeclaration)(e))},addressOf(e){const[n]=drop(e);return extendNode({value:n.value,params:[]},t("AddressOf")(e))}}}function makeLexer(){const e=moo.compile(waltSyntax_1);return{current:null,lines:[],get line(){return e.line},get col(){return e.col},save(){return e.save()},reset(t,n){return this.lines=t.split("\n"),e.reset(t,n)},next(){let t=e.next();for(;t&&"comment"===t.type;)t=e.next();return this.current=t,this.current},formatError(t){return e.formatError(t)},has(t){return e.has(t)}}}function enter$1(e,t){return[...e,{[namespace$1]:t,[signature$1]:{result:null,arguments:null}}]}function exit$1(e){return e.slice(0,-1)}function current$1(e){return e[e.length-1]}function add$2(e,t,n){const r=current$1(e);return r&&(r[t]=n),r}function find$1(e,t){let n=e.length-1;for(n;n>=0;n--){const r=e[n][t];if(r)return r}return null}function index$1(e,t){const n=Object.keys(e).indexOf(t);return n>-1?n:Object.keys(e).length}function Core(){return{semantics(){const e=e=>([t,n])=>{const r=scope_3(n.scopes);const o=scope_6(r,t.value);r[t.value]=extendNode({params:t.params.map(extendNode({type:t.type})),meta:_extends({},t.meta,{[r[scope_7]]:o,[TYPE_CONST]:t.Type===Syntax.ImmutableDeclaration}),Type:Syntax.Declaration},t);return e([r[t.value],n])};return{[Syntax.Export]:e=>([t,n])=>{const r=e([t,n]);const[o]=r.params;n.exports[o.value]=o;return r},[Syntax.Declaration]:e,[Syntax.ImmutableDeclaration]:e,[Syntax.Select]:e=>([e,t],n)=>balanceTypesInMathExpression(_extends({},e,{params:e.params.map(e=>n([e,t]))})),[Syntax.BinaryExpression]:e=>([e,t],n)=>balanceTypesInMathExpression(_extends({},e,{params:e.params.map(e=>n([e,t]))})),[Syntax.Pair]:e=>(e,t)=>{const[n,r]=e;const o=n.params.map(e=>t([e,r]));const[s,i]=o;const{type:a}=s;const{value:c}=i;return _extends({},n,{type:c,value:s.value,Type:Syntax.TypeCast,meta:_extends({},n.meta,{[TYPE_CAST]:{to:c,from:a}}),params:[s]})},[Syntax.Identifier]:e=>t=>{const[n,r]=t;let o=scope_4(r.scopes,n.value);if(o)return _extends({},n,{meta:_extends({},n.meta,o.meta),type:o.type});if("null"===n.value)return _extends({},n,{value:"0",type:"i32",Type:Syntax.Constant});return e(t)},[Syntax.TernaryExpression]:e=>([t,n])=>e([balanceTypesInMathExpression(_extends({},t,{params:[...t.params[1].params,t.params[0]]})),n])}}}}function base(){return{semantics(){return{"*":e=>(function([e,...t],n){return _extends({},e,{params:e.params.map(e=>n([e,...t]))})})}}}}function typePlugin(){return{semantics(){return{[Syntax.Typedef]:e=>([e])=>e,[Syntax.Program]:e=>t=>{const[n,r]=t;const{types:o}=r;const s=mapNode_2({[Syntax.Export]:(e,t)=>{const[n]=e.params;if(null!=n&&[Syntax.Typedef,Syntax.Struct].includes(n.Type))return t(_extends({},n,{meta:_extends({},n.meta,{EXPORTED:!0})}));return e},[Syntax.Typedef]:(e,t)=>{let n=0;const[r]=e.params;const s=[];walkNode({Assignment(e){const t=e.params[1];s.push(t)},Type(){n+=1}})(r);const i=_extends({},e,{meta:_extends({},e.meta,{FUNCTION_METADATA:{argumentsCount:n},DEFAULT_ARGUMENTS:s})});o[e.value]=i;return i}})(n);return e([s,r])}}}}}function unary(){return{semantics({stmt:e}){return{[Syntax.UnaryExpression]:t=>(t,n)=>{const[r,o]=t;const[s,i]=r.params.map(e=>n([e,o]));switch(r.value){case"!":const t=shifts[s.type];return n([e`(((${s} >> ${t}) | ((~${s} + 1) >> ${t})) + 1);`,o]);case"~":const a=masks[n([s,o]).type];return n([e`(${s} ^ ${a});`,o]);case"-":if(i.Type===Syntax.Constant)return _extends({},i,{meta:_extends({},i.meta,{SIGN:-1})});default:return n([_extends({},r,{type:i.type,params:[_extends({},s,{type:i.type}),i],Type:Syntax.BinaryExpression}),o])}}}}}}function coreFunctionPlugin(){return{semantics(){return{[Syntax.FunctionDeclaration]:e=>([e,t],n)=>{t.scopes=scope_1(t.scopes,LOCAL_INDEX);const r=scope_3(t.scopes);const[o,s,i]=e.params;const[a,c]=[o,s].map(e=>n([e,t]));const u=_extends({},e,{type:r[scope_8].result,meta:_extends({},e.meta,{[FUNCTION_INDEX]:Object.keys(t.functions).length,[FUNCTION_METADATA]:{argumentsCount:r[scope_8].arguments.length,locals:scope_3(t.scopes)}})});t.functions[e.value]=u;u.params=[a,c,n([i,t])];t.scopes=scope_2(t.scopes);return u},[Syntax.FunctionResult]:e=>([e,t])=>{const n=scope_3(t.scopes);n[scope_8].result=e.type;return e},[Syntax.FunctionArguments]:e=>([e,t],n)=>{const r=scope_3(t.scopes);r[scope_8].arguments=[];const o=mapNode_2({[Syntax.Pair]:(e,o)=>{const[s,i]=e.params;const a=n([i,t]);r[scope_8].arguments.push(e);n([_extends({},e,{value:s.value,type:a.value,params:[],Type:Syntax.Declaration}),t]);return _extends({},e,{params:[s,a]})}})(_extends({},e,{params:e.params.filter(Boolean)}));return o},[Syntax.FunctionCall]:e=>([t,n])=>{const{functions:r}=n;const o=Object.keys(r).indexOf(t.value);return e([_extends({},t,{type:null!=r[t.value]?r[t.value].type:null,meta:{[FUNCTION_INDEX]:o},params:t.params.slice(1)}),n])},[Syntax.ReturnStatement]:e=>([e,t],n)=>{const r=scope_3(t.scopes);const[o]=e.params.map(e=>n([e,t]));const{result:s}=r[scope_8];if(null!=o&&o.Type===Syntax.Constant&&typeWeight(o.type)!==typeWeight(s))return _extends({},e,{type:s,params:[_extends({},o,{type:s})]});const i=o?o.type:null;return _extends({},e,{params:[o],type:i})}}}}}function Imports(){return{semantics:()=>({[Syntax.Import]:e=>e=>{const[t,n]=e;return mapNode_2({[Syntax.BinaryExpression]:(e,t)=>{const[n,r]=e.params;if(n.Type!==Syntax.Pair)return e;const[o,s]=n.params;return t(_extends({},n,{params:[_extends({},r,{meta:_extends({},o.meta,{AS:o.value})}),s]}))},[Syntax.Pair]:(e,t)=>{const{types:r,functions:o}=n;const[s,i]=e.params;if(null!=r[i.value]){const t=Object.keys(o).length,n=Object.keys(r).indexOf(i.value),a=_extends({},s,{id:s.value,type:r[i.value].type,meta:_extends({},s.meta,{[FUNCTION_INDEX]:t,[TYPE_INDEX]:n,FUNCTION_METADATA:r[i.value].meta.FUNCTION_METADATA,DEFAULT_ARGUMENTS:r[i.value].meta.DEFAULT_ARGUMENTS})});return o[s.value]=a,_extends({},e,{params:[a,r[i.value]]})}if(["Table","Memory"].includes(i.value)){const e="Memory"===i.value?"memories":"tables";n[e].push(s)}else{const e=scope_3(n.scopes),t=scope_6(e,s.value);scope_5(n.scopes,s.value,_extends({},s,{meta:{[e[scope_7]]:t,[TYPE_CONST]:!0},type:i.type}))}return e}})(t)}})}}function booleanPlugin(){return{semantics(){const e=e=>([t,n])=>{if("bool"===t.type)return e([_extends({},t,{type:"i32"}),n]);return e([t,n])};return{[Syntax.Identifier]:e=>(t,n)=>{const[r,o]=t;if("true"!==r.value&&"false"!==r.value)return e(t);return n([_extends({},r,{Type:Syntax.Constant,value:"true"===r.value?"1":"0",type:"i32"}),o])},[Syntax.FunctionResult]:e=>([t,n])=>{if("bool"===t.type)return e([_extends({},t,{type:"i32"}),n]);return e([t,n])},[Syntax.Declaration]:e,[Syntax.ImmutableDeclaration]:e}}}}function withContext(e,t){const n=[null,t];return function(t){return n[0]=t,e(n)}}function pick(e,t){let n={},r=0;for(r;r<e.length;r++)n[e[r]]=t[e[r]];return n}function semantics$2({stmt:e}){function t(t,n){const r=shifts$1[t.meta.TYPE_ARRAY]||2;return n.Type!==Syntax.Constant||Number(n.value)?e`(${t} + (${n} << ${r}));`:e`(${t});`}function n(e){return!(null==e.type||null==e.index)}function r([e,n]){return{type:e.meta.TYPE_ARRAY,index:t(e,n),TYPE_ARRAY:e.meta.TYPE_ARRAY}}const o=e=>t=>{const[n,r]=t;if(!String(n.type).endsWith("[]"))return e(t);const o=extendNode({type:NATIVE_ARRAY_TYPE,meta:{TYPE_ARRAY:n.type.slice(0,-2)}},n);return e([o,r])};return{[Syntax.Declaration]:o,[Syntax.ImmutableDeclaration]:o,[Syntax.Identifier]:e=>t=>{const[n,r]=t;const o=scope_4(r.scopes,n.value);if(!o||!o.meta.TYPE_ARRAY)return e(t);return e([extendNode(pick(["type","meta"],o),n),r])},[Syntax.Assignment]:t=>(o,s)=>{const[i,a]=o;const[c,u]=i.params;if(c.Type!==Syntax.ArraySubscript)return t(o);const p=withContext(s,a);const l=r(c.params.map(p));const{type:m,index:d}=l;invariant_1(n(l),`PANIC - Cannot assign to subscript of ${c.value}`);return p(e`${m}.store(${d}, ${u});`)},[Syntax.ArraySubscript]:t=>(o,s)=>{const[i,a]=o;const c=withContext(s,a);const u=r(i.params.map(c));const{type:p,index:l,TYPE_ARRAY:m}=u;if(!n(u))return t(o);return extendNode({meta:{TYPE_ARRAY:m}},c(e`${p}.load(${l});`))},[Syntax.FunctionResult]:o}}function arrayPlugin(){return{semantics:semantics$2}}function memoryPlugin(){return{semantics({stmt:e}){return{[Syntax.ImmutableDeclaration]:e=>t=>{const[n,r]=t;const{scopes:o,memories:s}=r;if(!o.length<2&&"Memory"===n.type&&!s.length)return s.push(_extends({},n,{meta:_extends({},n.meta,{[GLOBAL_INDEX]:-1})})),s[0];return e(t)},[Syntax.FunctionCall]:t=>(n,r)=>{const[o,s]=n;const[i,...a]=o.params;const[c={},u={}]=i.params;const p={dataSize:r([e`i32.load(0);`,s]),grow:_extends({},c,{value:"grow_memory",params:a.map(e=>r([e,s])),Type:Syntax.NativeMethod}),size:_extends({},c,{value:"current_memory",params:[],Type:Syntax.NativeMethod})};const l=p[u.value];if(i.Type!==Syntax.Access||!isMemoryIdentifier(s,c)||!l)return t(n);return l}}}}}function*stringDecoder(e,t){let n=0,r=0,o=0,s=t;for(;;){const t=e.getUint8(s,!0);if(n|=(127&t)<<o,s+=1,0==(128&t))break;o+=7}let i=0;for(;r<n;){for(i=0,o=0;;){const t=e.getUint8(s,!0);if(i|=(127&t)<<o,s+=1,0==(128&t))break;o+=7}r+=1,yield i}}function stringEncoder(e){const t=new OutputStream,n=new OutputStream;n.push("varuint32",e.length,e);let r=0;for(r=0;r<e.length;r++)n.push("varuint32",e.codePointAt(r),e[r]);return t.write(n),t}function encodeArray(e,t){const n=new OutputStream,r=index$2[t];return e.forEach(e=>{n.push(r,e,String(e))}),n}function Strings(){let e=0;return{semantics:({stmt:t})=>({[Syntax.StaticDeclaration]:t=>([t,n],r)=>{const{userTypes:o,statics:s}=n;const i=String(t.type).slice(0,-2);const a=sizeMap[i];const c=t.params.reduce((e,t,o)=>{const s=r([t,n]);e.OBJECT_SIZE+=a;e.TYPE_OBJECT[o]=o*a;e.OBJECT_KEY_TYPES[o]=i;e.VALUES.push(Number(s.value));return e},{OBJECT_SIZE:0,TYPE_OBJECT:{},OBJECT_KEY_TYPES:{},VALUES:[],STATIC:i});const u=`__auto_gen_${t.value}_${e}`;e+=1;o[u]=_extends({},t,{value:u,Type:Syntax.Type,meta:c,params:[]});s[u]=encodeArray(c.VALUES,i);return r([_extends({},t,{meta:c,type:u,Type:Syntax.ImmutableDeclaration,params:[_extends({},t.params[0],{value:u,Type:Syntax.StaticValueList})]}),n])},[Syntax.ArraySubscript]:e=>([n,r],o)=>{const[s,i]=n.params.map(e=>o([e,r]));if(!s.meta.STATIC)return e([n,r]);const a={i32:2,f32:2,i64:3,f64:3}[s.meta.STATIC];return o([t`${s.meta.STATIC}.load(${s} + (${i} << ${a}));`,r])},[Syntax.CharacterLiteral]:e=>([e,t],n)=>{const r=escapeMap[e.value]||e.value.codePointAt(0);return n([_extends({},e,{Type:"Constant",type:"i32",value:String(r)}),t])},[Syntax.StringLiteral]:e=>e=>{const[t,n]=e;const{statics:r}=n;const{value:o}=t;o in r||(r[o]=stringEncoder(o));return t}})}}function functionPointer(){return{semantics(){return{[Syntax.ImmutableDeclaration]:e=>(function(t){const[n,r]=t;return r.locals||"Table"!==n.type?e(t):_extends({},n,{meta:_extends({},n.meta,{[GLOBAL_INDEX]:-1})})}),[Syntax.Identifier]:e=>(function(t){const[n,r]=t,{functions:o,table:s,scopes:i}=r;return scope_4(i,n.value)||!o[n.value]?e(t):(null==s[n.value]&&(s[n.value]=o[n.value]),_extends({},n,{type:"i32",meta:{[FUNCTION_INDEX]:o[n.value].meta[FUNCTION_INDEX]},value:Object.keys(s).indexOf(n.value),Type:Syntax.FunctionPointer}))}),[Syntax.FunctionResult]:e=>(t,n)=>{const[r,o]=t;const{types:s}=o;if(!s[r.type])return e(t);return e([extendNode({type:"i32",meta:{ALIAS:r.type},params:r.params.map(e=>n([e,o]))},r),o])},[Syntax.FunctionCall]:e=>(function(t,n){const[r,o]=t,{scopes:s,types:i}=o,a=scope_4(s,r.value);if(!a)return e(t);const c=i[a.type],u=Object.keys(i).indexOf(a.type),p=[...r.params.slice(1),_extends({},a,{Type:Syntax.Identifier})].map(e=>n([e,o]));return _extends({},r,{meta:_extends({},r.meta,a.meta,{[TYPE_INDEX]:u}),type:null!=c?c.type:r.type,params:p,Type:Syntax.IndirectFunctionCall})})}}}}function Struct(){return{semantics({stmt:e}){function t(e,t){const[n,o]=e,[s,i]=n.params,[a,c]=s.params;return t([r(t([a,o]),c).store(i),o])}function n(e,t){const[n,o]=e,[s,i]=n.params,a=t([s,o]),c=[];walkNode({[Syntax.Identifier]:(e,t)=>{const n=r(a,e);c.push({field:n,value:e})},[Syntax.Pair]:(e,t)=>{const[n,o]=e.params;const s=r(a,n);c.push({field:s,value:o})},[Syntax.Spread]:(e,n)=>{const s=t([e.params[0],o]);Object.keys(s.meta.TYPE_OBJECT).forEach(e=>{const t=r(a,{value:e,type:null,range:s.range});const n=r(s,{value:e,type:null,range:s.range});c.push({field:t,value:n.load})})}})(i);const u=c.filter(({field:e})=>null!=e).map(e=>t([e.field.store(e.value),o]));return _extends({},s,{Type:Syntax.Block,params:u})}const r=makeStruct(e);return{[Syntax.Struct]:e=>([e,t],n)=>{const{userTypes:r,aliases:o}=t;const[s]=e.params;let i=_extends({},e,{meta:_extends({},e.meta,{TYPE_OBJECT:{},OBJECT_SIZE:0,OBJECT_KEY_TYPES:{}})});const a=()=>{o[e.value]=s.value};const c=(e,t)=>{const[n,r,o]=getByteOffsetsAndSize(e);i.meta.TYPE_OBJECT=_extends({},i.meta.TYPE_OBJECT,n);i.meta.OBJECT_SIZE+=r;i.meta.OBJECT_KEY_TYPES=_extends({},i.meta.OBJECT_KEY_TYPES,o)};const u={[Syntax.Type]:a,[Syntax.Identifier]:a,[Syntax.ObjectLiteral]:()=>{c(e);r[i.value]=i},[Syntax.UnionType]:()=>{walkNode({[Syntax.ObjectLiteral]:c,[Syntax.ArrayType]:e=>{i.meta.TYPE_ARRAY=e.type.slice(0,-2)},[Syntax.Identifier]:e=>{const o=r[n([e,t]).value];i.meta.TYPE_OBJECT=_extends({},i.meta.TYPE_OBJECT,o.meta.TYPE_OBJECT);i.meta.OBJECT_SIZE=Math.max(i.meta.OBJECT_SIZE,o.meta.OBJECT_SIZE);i.meta.OBJECT_KEY_TYPES=_extends({},i.meta.OBJECT_KEY_TYPES,o.meta.OBJECT_KEY_TYPES)}})(s);r[i.value]=i}};u[s.Type]();i.meta.OBJECT_KEY_TYPES=Object.entries(i.meta.OBJECT_KEY_TYPES).reduce((e,[t,n])=>{e[t]=r[n]||n;return e},{});return i},[Syntax.DeclType]:e=>(t,n)=>{const[r,o]=t;const{aliases:s}=o;if(s[r.value])return n([extendNode({value:s[r.value],type:s[r.value]},r),o]);return e(t)},[Syntax.FunctionResult]:e=>(t,n)=>{const[r,o]=t;const{userTypes:s,aliases:i}=o;if(i[r.type])return n([extendNode({type:i[r.type]},r),o]);if(!s[String(r.type)])return e(t);return e([extendNode({type:STRUCT_NATIVE_TYPE,meta:{STRUCT_TYPE:s[r.type]},params:r.params.map(e=>n([e,o]))},r),o])},[Syntax.Identifier]:e=>t=>{const[n,r]=t;const{userTypes:o,scopes:s}=r;const i=scope_4(s,n.value);if(!i||!o[i.type])return e(t);return _extends({},n,{meta:_extends({},n.meta,i.meta,o[i.type].meta,{STRUCT_TYPE:o[i.type]}),type:STRUCT_NATIVE_TYPE})},[Syntax.Access]:function(e){return(e,t)=>{const[n,o]=e;const[s,i]=n.params;const a=r(t([s,o]),i);return t([a.load,o])}},[Syntax.Assignment]:e=>(r,o)=>{const[s]=r;const[i,a]=s.params;if(i.Type===Syntax.Access)return t(r,o);if(a.Type===Syntax.ObjectLiteral)return n(r,o);return e(r)},[Syntax.ArraySubscript]:t=>(n,r)=>{const[o,s]=n;const i=t(n);if(null==s.userTypes[i.meta.TYPE_ARRAY])return i;const[a,c]=o.params.map(e=>r([e,s]));return r([extendNode({type:STRUCT_NATIVE_TYPE,meta:{STRUCT_TYPE:s.userTypes[i.meta.TYPE_ARRAY]}},e`(${a} + (${c} * sizeof(${i.meta.TYPE_ARRAY})));`),s])}}}}}function nativePlugin(){return{semantics(){return{[Syntax.FunctionCall]:e=>(t,n)=>{const[r,o]=t;const[s,...i]=r.params;if(s.Type===Syntax.Access&&s.params[0]&&s.params[0].Type===Syntax.Type){const[e,t]=s.params;return extendNode({value:`${e.value}.${t.value}`,type:e.value,params:i.map(e=>n([e,o])),Type:Syntax.NativeMethod},r)}return e(t)},[Syntax.Unreachable]:e=>([e])=>extendNode({value:"unreachable",params:[],Type:Syntax.NativeMethod},e)}}}}function defaultArguments(){return{grammar:grammar$1,semantics(){return{[Syntax.FunctionDeclaration]:e=>t=>{const[n,r]=t;const[o]=n.params;const s=[];walkNode({Assignment:e=>{const[,t]=e.params;s.push(t)}})(o);return e([_extends({},n,{meta:_extends({},n.meta,{DEFAULT_ARGUMENTS:s})}),r])},[Syntax.FunctionCall]:e=>t=>{const[n,r]=t;const{functions:o}=r;const[s,...i]=n.params;const a=o[s.value];if(!a)return e(t);const c=a.meta.FUNCTION_METADATA.argumentsCount;const u=i.length;const p=c-u;if(p>0)return e([_extends({},n,{params:[...n.params,...a.meta.DEFAULT_ARGUMENTS.slice(p-1)]}),r]);return e(t)}}}}}function sizeofPlugin(){return{semantics(){return{[Syntax.FunctionCall]:e=>t=>{const[n,r]=t;if("sizeof"!==n.value)return e(t);const{scopes:o,userTypes:s,functions:i}=r;const[,a]=n.params;const c=scope_4(o,a.value);const{type:u=""}=c||{};const p=s[a.value]||s[u];const l=i[a.value];if(null!=p){const e=p.meta[OBJECT_SIZE];return invariant_1(e,"Object size information is missing"),_extends({},n,{value:e,params:[],type:"i32",Type:Syntax.Constant})}const m=c||l;return _extends({},n,{value:sizes$1[String(m?m.type:a.value)],type:"i32",params:[],Type:Syntax.Constant})}}}}}function semantics(e,t,n){const r=[...getBuiltInParsers(),...t],o=combineParsers(r.map(e=>e(n))),s={functions:{},types:{},userTypes:{},table:{},hoist:[],statics:{},path:[],scopes:scope_1([],GLOBAL_INDEX),memories:[],tables:[],aliases:{},exports:{}},i=mapNode_1(o)([e,s]),{functions:a,scopes:c,types:u,userTypes:p,statics:l,hoist:m,exports:d}=s;return _extends({},i,{meta:_extends({},i.meta,{[AST_METADATA]:{functions:a,globals:c[0],types:u,userTypes:p,statics:l,exports:d}}),params:[...i.params,...m]})}function generateErrorString(e,t,n,r,o){const s=n.start.line,i=n.start.col,a=n.end.col;return"\n"+n.end.sourceLine+"\n"+new Array(a-i+1).join("^").padStart(n.start.col-1," ")+` ${t}`+"\n"+e+"\n"+` at ${o} (${r}:${s}:${i})`}function validate(e,{filename:t}){const n=e.meta[AST_METADATA];if(null==n)throw new Error("Missing AST metadata!");const{types:r,functions:o,userTypes:s}=n,i=[];walkNode({[Syntax.Import]:(e,n)=>{walkNode({[Syntax.BinaryExpression]:(e,n)=>{const[r,o]=e.range;i.push(generateErrorString("Using an 'as' import without a type.","A type for original import "+e.params[0].value+" is not defined nor could it be inferred.",{start:r,end:o},t,GLOBAL_LABEL))},[Syntax.Identifier]:(e,n)=>{const[r,o]=e.range;i.push(generateErrorString("Infered type not supplied.","Looks like you'd like to infer a type, but it was never provided by a linker. Non-concrete types cannot be compiled.",{start:r,end:o},t,GLOBAL_LABEL))},[Syntax.Pair]:(e,n)=>{const o=e.params[1];if(!isBuiltinType(o.value)&&null==r[o.value]){const[e,n]=o.range;i.push(generateErrorString(`Undefined Type ${o.value}`,`Invalid Import. ${o.value} type does not exist`,{start:e,end:n},t,GLOBAL_LABEL))}}})(e)},[Syntax.Struct]:(e,t)=>{},[Syntax.ImmutableDeclaration]:(e,t)=>{},[Syntax.Declaration]:(e,n)=>{const[o,a]=e.range;isBuiltinType(e.type)||r[e.type]||s[e.type]||i.push(generateErrorString("Unknown type used in a declaration, "+`"${String(e.type)}"`,"Variables must be assigned with a known type.",{start:o,end:a},t,GLOBAL_LABEL))},[Syntax.FunctionDeclaration]:(e,n)=>{const a=`${e.value}()`;walkNode({[Syntax.Declaration]:(e,n)=>{const[o,c]=e.range;isBuiltinType(e.type)||r[e.type]||s[e.type]||i.push(generateErrorString("Unknown type used in a declartion, "+`"${String(e.type)}"`,"Variables must be assigned with a known type.",{start:o,end:c},t,a))},[Syntax.Assignment]:e=>{const[n]=e.params;const[r,o]=e.range;const s=n.meta[TYPE_CONST];s&&i.push(generateErrorString(`Cannot reassign a const variable ${n.value}`,"const variables cannot be reassigned, use let instead.",{start:r,end:o},t,a))},[Syntax.ArraySubscript]:e=>{const[n]=e.params;const[r,o]=e.range;i.push(generateErrorString("Invalid subscript target",`Expected array type for ${n.value}, received ${n.type}`,{start:r,end:o},t,a))},[Syntax.NativeMethod]:(e,n)=>{const{value:r}=e;const[o={},s]=e.params;const[c,u]=e.range;if("unreachable"!==o.value||!r.includes("store")&&!r.includes("load"))return;i.push(generateErrorString("Cannot generate property access",`Cannot assign "${s.value}". Key is "${o.value}"`,{start:c,end:u},t,a))},[Syntax.ReturnStatement]:(n,r)=>{n.params.map(r);if(null==e.type)return;const[o]=n.params;const[s]=n.range;const c=null!=o?o.range[1]:n.range[1];const u=n.type;typeWeight(u)!==typeWeight(e.type)&&i.push(generateErrorString("Missing return value","Inconsistent return value. Expected "+e.type+" received "+String(u),{start:s,end:c},t,a))},[Syntax.FunctionCall]:(e,n)=>{if(null==o[e.value]){const[n,r]=e.range;i.push(generateErrorString("Undefined function reference",`${e.value} is not defined.`,{start:n,end:r},t,a))}},[Syntax.IndirectFunctionCall]:(e,n)=>{const o=e.params[e.params.length-1];const s=r[o.type];if(!isBuiltinType(o.type)&&null==s){const[n,r]=e.range;i.push(generateErrorString("Cannot make an indirect call without a valid function type",`${o.value} has type ${String(o.type)} which is not defined. Indirect calls must have pre-defined types.`,{start:n,end:r},t,a))}}})(e)}})(e);const a=i.length;if(a>0){const e=i.reduce((e,t)=>e+"\n"+`${t}\n`,`Cannot generate WebAssembly for ${t}. ${a} problems.\n`);throw new Error(e)}}function generateNoop(){return[]}function generateExport(e){const t=e.meta[FUNCTION_INDEX],n=e.meta[GLOBAL_INDEX];if(null!=n){const t=externaKindMap[String(e.type)]||EXTERN_GLOBAL,r=[EXTERN_MEMORY,EXTERN_TABLE].includes(t)?0:n;return{index:r,kind:t,field:e.value}}return{index:t,kind:EXTERN_FUNCTION,field:e.value}}function generateMemory$2(e){const t={max:0,initial:0,type:"element"};return walkNode({[Syntax.Pair]:({params:e})=>{const[{value:n},{value:r}]=e;switch(n){case"initial":t.initial=parseInt(r);break;case"element":t.type=r;break;case"max":t.max=parseInt(r)}}})(e),t}function generateImportFromNode(e){const[t,n]=e.params,{value:r}=n,o=[];return walkNode({[Syntax.Pair]:(e,t)=>{const[n,s]=e.params;const i=getFieldName(n);const{value:a}=s;const c=getKindConstant(a);const u=(()=>{const e=s.meta[TYPE_INDEX];if(e)return e;return null})();const p="Memory"===a?parseBounds(s):{};o.push(_extends({module:r,field:i,global:c===EXTERN_GLOBAL,kind:c,type:stringToType[a],typeIndex:u},p))}})(t),o}function generateType(e){const t=e.value;invariant_1("string"==typeof t,`Generator: A type must have a valid string identifier, node: ${JSON.stringify(e)}`);const[n,r]=e.params,o=[];return walkNode({[Syntax.DeclType]:(e,t)=>{o.push(getType$1(e.value))},[Syntax.Type]:(e,t)=>{o.push(getType$1(e.value))},[Syntax.Identifier]:(e,t)=>{o.push(getType$1(e.value))}})(n),{id:t,params:o,result:r.type&&"void"!==r.type?getType$1(r.type):null}}function generateData(e,t){let n=t;const r={},o=Object.entries(e).reduce((e,[t,o])=>{e.push({offset:Number(n),data:o});r[t]=n;n+=o.size;return e},[]),s=new OutputStream;return s.push(index_12,n,String(n)),{data:[{offset:0,data:s},...o],map:r}}function generator(e,t){const n={Version:t.version,Types:[],Start:[],Element:[],Code:[],Exports:[],Imports:[],Globals:[],Functions:[],Memory:[],Table:[],Artifacts:[],Data:[],Name:{module:t.filename,functions:[],locals:[]}};let{statics:r}=e.meta[AST_METADATA];null!=t.linker&&(r=_extends({},t.linker.statics,r));const{map:o,data:s}=generateData(r,DATA_SECTION_HEADER_SIZE);Object.keys(r).length>0&&(n.Data=s);const i=e=>{const t=generateImplicitFunctionType(e);return n.Types.findIndex(e=>{const n=e.params.length===t.params.length&&e.params.reduce((e,n,r)=>e&&n===t.params[r],!0);const r=e.result===t.result;return n&&r})},a=e=>n.Element.findIndex(t=>t.functionIndex===e),c={},u=mapNode_2({[Syntax.Typedef]:(e,t)=>{let r=n.Types.findIndex(({id:t})=>t===e.value);let o=n.Types[r];null==o&&(r=n.Types.length,n.Types.push(generateType(e)));o=_extends({},e,{meta:_extends({},e.meta,{[TYPE_INDEX]:r})});c[e.value]={typeIndex:r,typeNode:o};return o}})(mapNode_2({[Syntax.Import]:(e,t)=>e,[Syntax.StringLiteral]:(e,t)=>{const{value:n}=e;if(null==o[n])return e;return _extends({},e,{value:String(o[n]),Type:Syntax.Constant})},[Syntax.StaticValueList]:e=>{const{value:t}=e;return _extends({},e,{value:String(o[t]),Type:Syntax.Constant})}})(e));return walkNode({[Syntax.Typedef]:(e,t)=>e,[Syntax.Export]:e=>{const[t]=e.params;n.Exports.push(generateExport(t))},[Syntax.ImmutableDeclaration]:e=>{switch(e.type){case"Memory":n.Memory.push(generateMemory(e));break;case"Table":n.Table.push(generateMemory$2(e))}},[Syntax.Declaration]:e=>{const t=e.meta[GLOBAL_INDEX];null!=t&&n.Globals.push(generateInit(e))},[Syntax.Import]:e=>{n.Imports.push(...generateImportFromNode(e))},[Syntax.FunctionDeclaration]:e=>{const r=(()=>{const t=i(e);if(-1===t)return n.Types.push(generateImplicitFunctionType(e)),n.Types.length-1;return t})();const o=mapNode_2({FunctionPointer(e){const t=e.meta[FUNCTION_INDEX];let r=a(t);return r<0&&(r=n.Element.length,n.Element.push(generateElement(t))),e}})(e);const s=e.meta[FUNCTION_INDEX];invariant_1(null!=s,"Function index must be set");n.Functions[s]=r;n.Code[s]=generateCode(o);"start"===o.value&&n.Start.push(s);if(t.encodeNames){n.Name.functions.push({index:s,name:e.value});const t=e.meta[FUNCTION_METADATA];null!=t&&Object.keys(t.locals).length&&(n.Name.locals[s]={index:s,locals:Object.entries(t.locals).map(([e,t])=>({name:e,index:Number(t.meta["local/index"])}))})}}})(u),n.Code=n.Code.filter(Boolean),n}function write(e){return(new OutputStream).push(index_12,MAGIC,"\\0asm").push(index_12,e,`version ${e}`)}function emitString(e,t,n){e.push(varuint32,t.length,n);for(let n=0;n<t.length;n++)e.push(index_9,t.charCodeAt(n),t[n]);return e}function emitTables(e){const t=new OutputStream;return t.push(varuint32,e[0],"start function"),t}function emitTables$1(e){const t=new OutputStream;return t.push(varuint32,e.length,"count"),e.forEach(e=>emitEntry$1(t,e)),t}function emit$9(e){const t=new OutputStream;t.push(varuint32,e.length,"entries");for(let n=0,r=e.length;n<r;n++){const r=e[n];emitDataSegment(t,r)}return t}function emit(e,t){const n=(new OutputStream).write(write(e.Version)).write(section.type(e)).write(section.imports(e)).write(section.function(e)).write(section.table(e)).write(section.memory(e)).write(section.globals(e)).write(section.exports(e)).write(section.start(e)).write(section.element(e)).write(section.code(e)).write(section.data(e));return t.encodeNames?n.write(section.name(e)):n}var immutable=extend,hasOwnProperty=Object.prototype.hasOwnProperty;const identity=e=>e;var mapNode_1$1={map:map,mapNode:mapNode$2},mapNode=mapNode_1$1,mapNode_1=mapNode.map,mapNode_2=mapNode.mapNode,walkNode$2=function(e){const t=n=>{if(null==n)return n;const{params:r}=n;const o=(()=>{if("*"in e&&"function"==typeof e["*"])return e["*"];if(n.Type in e&&"function"==type