Compare commits

..

11 Commits

Author SHA1 Message Date
57b582a0c2 it's alive 2025-11-03 13:34:32 -08:00
32c47cfd24 old syntax 2025-11-03 13:34:32 -08:00
a161679903 insanity 2025-11-03 13:34:31 -08:00
da77bf1686 what have i done 2025-11-03 13:34:26 -08:00
458371b802 ./bin/shrimp parse file 2025-11-03 13:34:19 -08:00
Chris Wanstrath
402748d1da start exporting a package API 2025-11-03 13:26:53 -08:00
Chris Wanstrath
cc06bdf2a7 update package name 2025-11-03 13:08:36 -08:00
fec4b626df Merge pull request 'Add default param values' (#18) from defaults into main
Reviewed-on: #18
Reviewed-by: probablycorey <probablycorey@gmail.com>
2025-11-03 16:54:43 +00:00
fa034d4bd4 only constant values can be defaults 2025-11-02 16:52:20 -08:00
8addb77e90 make defaults work, like magic 2025-11-02 16:34:59 -08:00
1791e5a6c7 parse defaults 2025-11-02 14:04:32 -08:00
8 changed files with 163 additions and 35 deletions

View File

@ -1,6 +1,7 @@
{ {
"name": "bun-react-template", "name": "shrimp",
"version": "0.1.0", "version": "0.1.0",
"exports": "./src/index.ts",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {

View File

@ -282,3 +282,31 @@ describe('dot get', () => {
expect(`a = 1; arr = array 'a' 'b' 'c'; arr.(1 + a)`).toEvaluateTo('c', { array }) expect(`a = 1; arr = array 'a' 'b' 'c'; arr.(1 + a)`).toEvaluateTo('c', { array })
}) })
}) })
describe('default params', () => {
test('function with single default parameter', () => {
expect('add1 = do x=1: x + 1 end; add1').toEvaluateTo(2)
expect('add1 = do x=1: x + 1 end; add1 5').toEvaluateTo(6)
})
test('function with multiple default parameters', () => {
expect(`weird = do x='something' y=true: [x y] end; weird`).toEvaluateTo(['something', true])
})
test('function with mixed parameters', () => {
expect('multiply = do x y=5: x * y end; multiply 5').toEvaluateTo(25)
expect('multiply = do x y=5: x * y end; multiply 5 2').toEvaluateTo(10)
})
test.skip('array default', () => {
expect('abc = do alpha=[a b c]: alpha end; abc').toEvaluateTo(['a', 'b', 'c'])
expect('abc = do alpha=[a b c]: alpha end; abc [x y z]').toEvaluateTo(['x', 'y', 'z'])
})
test.skip('dict default', () => {
expect('make-person = do person=[name=Bob age=60]: person end; make-person')
.toEvaluateTo({ name: 'Bob', age: 60 })
expect('make-person = do person=[name=Bob age=60]: person end; make-person [name=Jon age=21]')
.toEvaluateTo({ name: 'Jon', age: 21 })
})
})

View File

@ -99,9 +99,9 @@ export const getFunctionDefParts = (node: SyntaxNode, input: string) => {
} }
const paramNames = getAllChildren(paramsNode).map((param) => { const paramNames = getAllChildren(paramsNode).map((param) => {
if (param.type.id !== terms.Identifier) { if (param.type.id !== terms.Identifier && param.type.id !== terms.NamedParam) {
throw new CompilerError( throw new CompilerError(
`FunctionDef params must be Identifier, got ${param.type.name}`, `FunctionDef params must be Identifier or NamedParam, got ${param.type.name}`,
param.from, param.from,
param.to param.to
) )

39
src/index.ts Normal file
View File

@ -0,0 +1,39 @@
import { readFileSync } from 'fs'
import { VM, fromValue, type Bytecode } from 'reefvm'
import { Compiler } from '#compiler/compiler'
import { globals, colors } from '#prelude'
export { Compiler } from '#compiler/compiler'
export { parser } from '#parser/shrimp'
export { globals } from '#prelude'
export async function runFile(path: string): Promise<any> {
const code = readFileSync(path, 'utf-8')
return await runCode(code)
}
export async function runCode(code: string): Promise<any> {
const compiler = new Compiler(code, Object.keys(globals))
return await runBytecode(compiler.bytecode)
}
export async function runBytecode(bytecode: Bytecode): Promise<any> {
try {
const vm = new VM(bytecode, globals)
await vm.run()
return vm.stack.length ? fromValue(vm.stack[vm.stack.length - 1]!) : null
} catch (error: any) {
console.error(`${colors.red}Error:${colors.reset} ${error.message}`)
process.exit(1)
}
}
export function compileFile(path: string): Bytecode {
const code = readFileSync(path, 'utf-8')
return compileCode(code)
}
export function compileCode(code: string): Bytecode {
const compiler = new Compiler(code, Object.keys(globals))
return compiler.bytecode
}

View File

@ -188,7 +188,11 @@ ConditionalOp {
} }
Params { Params {
Identifier* Identifier* NamedParam*
}
NamedParam {
NamedArgPrefix (String | Number | Boolean | @specialize[@name=Null]<Identifier, "null">)
} }
Assign { Assign {

View File

@ -43,23 +43,24 @@ export const
NamedArgPrefix = 41, NamedArgPrefix = 41,
FunctionDef = 42, FunctionDef = 42,
Params = 43, Params = 43,
colon = 44, NamedParam = 44,
CatchExpr = 45, Null = 45,
keyword = 69, colon = 46,
TryBlock = 47, CatchExpr = 47,
FinallyExpr = 48, keyword = 70,
Underscore = 51, TryBlock = 49,
Array = 52, FinallyExpr = 50,
Null = 53, Underscore = 53,
ConditionalOp = 54, Array = 54,
PositionalArg = 55, ConditionalOp = 55,
FunctionCallWithBlock = 57, PositionalArg = 56,
TryExpr = 58, FunctionCallWithBlock = 58,
Throw = 60, TryExpr = 59,
IfExpr = 62, Throw = 61,
SingleLineThenBlock = 64, IfExpr = 63,
ThenBlock = 65, SingleLineThenBlock = 65,
ElseIfExpr = 66, ThenBlock = 66,
ElseExpr = 68, ElseIfExpr = 67,
CompoundAssign = 70, ElseExpr = 69,
Assign = 71 CompoundAssign = 71,
Assign = 72

View File

@ -4,24 +4,24 @@ import {operatorTokenizer} from "./operatorTokenizer"
import {tokenizer, specializeKeyword} from "./tokenizer" import {tokenizer, specializeKeyword} from "./tokenizer"
import {trackScope} from "./scopeTracker" import {trackScope} from "./scopeTracker"
import {highlighting} from "./highlight" import {highlighting} from "./highlight"
const spec_Identifier = {__proto__:null,catch:92, finally:98, end:100, null:106, try:118, throw:122, if:126, elseif:134, else:138} const spec_Identifier = {__proto__:null,null:90, catch:96, finally:102, end:104, try:120, throw:124, if:128, elseif:136, else:140}
export const parser = LRParser.deserialize({ export const parser = LRParser.deserialize({
version: 14, version: 14,
states: ";fQYQbOOO#tQcO'#C{O$tOSO'#C}O%SQbO'#EgOOQ`'#DW'#DWOOQa'#DT'#DTO&VQbO'#DbO'hQcO'#E[OOQa'#E['#E[O(kQcO'#E[O)mQcO'#EZO*QQRO'#C|O+^QcO'#EVO+nQcO'#EVO+xQbO'#CzO,pOpO'#CxOOQ`'#EW'#EWO,uQbO'#EVOOQ`'#Dg'#DgO-PQQO'#EoOOQ`'#Dh'#DhO-UQbO'#DjO-UQbO'#EqOOQ`'#Dl'#DlO-yQRO'#DtOOQ`'#EV'#EVO._QQO'#EUOOQ`'#EU'#EUOOQ`'#Dv'#DvQYQbOOO.gQbO'#DUOOQa'#EZ'#EZOOQ`'#De'#DeOOQ`'#El'#ElOOQ`'#D}'#D}O.qQbO,59cO/hQbO'#DPO/pQWO'#DQOOOO'#E^'#E^OOOO'#Dw'#DwO0UOSO,59iOOQa,59i,59iOOQ`'#Dy'#DyO0dQbO'#DXO0lQQO,5;ROOQ`'#Dx'#DxO0qQbO,59|O0xQQO,59oOOQa,59|,59|O1TQbO,59|O1_QbO,5:aO-UQbO,59hO-UQbO,59hO-UQbO,59hO-UQbO,5:OO-UQbO,5:OO-UQbO,5:OO1oQRO,59fO1vQRO,59fO2XQRO,59fO2SQQO,59fO2dQQO,59fO2lObO,59dO2wQbO'#EOO3SQbO,59bO3kQbO,5;XO4OQbO,5;ZO4cQcO,5:UO5XQcO,5:UO5iQcO,5:UO6_QRO,5;]O6fQRO,5;]O1_QbO,5:`OOQ`,5:p,5:pOOQ`-E7t-E7tOOQ`,59p,59pOOQ`-E7{-E7{OOOO,59k,59kOOOO,59l,59lOOOO-E7u-E7uOOQa1G/T1G/TOOQ`-E7w-E7wO6qQbO1G0mOOQ`-E7v-E7vO7UQQO1G/ZOOQa1G/h1G/hO7aQbO1G/hOOQO'#D{'#D{O7UQQO1G/ZOOQa1G/Z1G/ZOOQ`'#D|'#D|O7aQbO1G/hOOQ`1G/{1G/{OOQa1G/S1G/SO8YQcO1G/SO8dQcO1G/SO8nQcO1G/SOOQa1G/j1G/jO:^QcO1G/jO:eQcO1G/jO:lQcO1G/jOOQa1G/Q1G/QOOQa1G/O1G/OO!aQbO'#C{O:sQbO'#CwOOQ`,5:j,5:jOOQ`-E7|-E7|O;QQbO1G0sO;]QbO1G0tO;yQbO1G0uO;]QbO1G0vO<UQbO1G0wOOQ`1G/z1G/zO<iQbO7+&XO;]QbO7+&ZO<tQQO7+$uOOQa7+$u7+$uO=PQbO7+%SOOQa7+%S7+%SOOQO-E7y-E7yOOQ`-E7z-E7zO=ZQbO'#DZO=`QQO'#D^OOQ`7+&_7+&_O=eQbO7+&_O=jQbO7+&_OOQ`'#Dz'#DzO=rQQO'#DzO=wQbO'#EhO>kQbO7+&`OOQ`7+&a7+&aO>vQbO7+&aO>{QbO7+&aOOQ`'#D]'#D]O?TQbO7+&bOOQ`'#Dn'#DnO?`QbO7+&cO?eQbO7+&dOOQ`<<Is<<IsO@RQbO<<IsO@WQbO<<IsO@`QbO<<IuOOQa<<Ha<<HaOOQa<<Hn<<HnO@kQQO,59uO@pQbO,59xOOQ`<<Iy<<IyOATQbO<<IyOOQ`,5:f,5:fOOQ`-E7x-E7xOOQ`<<Iz<<IzOAYQbO<<IzOA_QbO<<IzOOQ`<<I{<<I{OAgQbO<<I{OOQ`<<I|<<I|OAlQbO<<I|OAqQbO<<I|OOQ`<<I}<<I}OOQ`'#Do'#DoOAyQbO<<JOOOQ`AN?_AN?_OBUQbOAN?_OOQ`AN?aAN?aOBZQbOAN?aOB`QbOAN?aOBhQbO1G/aOB{QbO1G/dOOQ`1G/d1G/dOOQ`AN?eAN?eOOQ`AN?fAN?fOCcQbOAN?fOOQ`AN?gAN?gOOQ`AN?hAN?hOChQbOAN?hO-UQbO'#DpOOQ`'#EP'#EPOCmQbOAN?jOCxQQO'#DrOOQ`AN?jAN?jOC}QbOAN?jOOQ`G24yG24yOOQ`G24{G24{ODSQbOG24{ODXQbO7+${OOQ`7+${7+${OOQ`7+%O7+%OOOQ`G25QG25QOOQ`G25SG25SODrQRO,5:[ODyQRO,5:[OOQ`-E7}-E7}OOQ`G25UG25UOEUQbOG25UOEZQQO,5:^OOQ`LD*gLD*gOOQ`<<Hg<<HgOE`QQO1G/vOOQ`LD*pLD*pOB{QbO1G/xO?eQbO7+%bOOQ`7+%d7+%dOOQ`<<H|<<H|", states: "<[QYQbOOO#tQcO'#C{O$tOSO'#C}O%SQbO'#EiOOQ`'#DW'#DWOOQa'#DT'#DTO&YQbO'#DdO'kQcO'#E^OOQa'#E^'#E^O(nQcO'#E^O)pQcO'#E]O*TQRO'#C|O+aQcO'#EXO+qQcO'#EXO+{QbO'#CzO,sOpO'#CxOOQ`'#EY'#EYO,xQbO'#EXOOQ`'#Dh'#DhO-SQQO'#EqOOQ`'#Di'#DiO-XQbO'#DkO-XQbO'#EsOOQ`'#Dm'#DmO-|QRO'#DuOOQ`'#EX'#EXO.bQQO'#EWOOQ`'#EW'#EWOOQ`'#Dw'#DwQYQbOOO.jQbO'#DUOOQa'#E]'#E]OOQ`'#Df'#DfOOQ`'#En'#EnOOQ`'#EP'#EPO.tQbO,59cO/kQbO'#DPO/sQWO'#DQOOOO'#E`'#E`OOOO'#Dx'#DxO0XOSO,59iOOQa,59i,59iOOQ`'#Dz'#DzO0gQbO'#DXO0rQbO'#DYOOQO'#D{'#D{O0jQQO'#DXO1QQQO,5;TOOQ`'#Dy'#DyO1VQbO,5:OO1^QQO,59oOOQa,5:O,5:OO1iQbO,5:OO1sQbO,5:bO-XQbO,59hO-XQbO,59hO-XQbO,59hO-XQbO,5:PO-XQbO,5:PO-XQbO,5:PO2TQRO,59fO2[QRO,59fO2mQRO,59fO2hQQO,59fO2xQQO,59fO3QObO,59dO3]QbO'#EQO3hQbO,59bO4PQbO,5;ZO4dQbO,5;]O4wQcO,5:VO5mQcO,5:VO5}QcO,5:VO6sQRO,5;_O6zQRO,5;_O1sQbO,5:aOOQ`,5:r,5:rOOQ`-E7u-E7uOOQ`,59p,59pOOQ`-E7}-E7}OOOO,59k,59kOOOO,59l,59lOOOO-E7v-E7vOOQa1G/T1G/TOOQ`-E7x-E7xO7VQQO,59sOOQO,59t,59tOOQO-E7y-E7yO7_QbO1G0oOOQ`-E7w-E7wO7rQQO1G/ZOOQa1G/j1G/jO7}QbO1G/jOOQO'#D}'#D}O7rQQO1G/ZOOQa1G/Z1G/ZOOQ`'#EO'#EOO7}QbO1G/jOOQ`1G/|1G/|OOQa1G/S1G/SO8vQcO1G/SO9QQcO1G/SO9[QcO1G/SOOQa1G/k1G/kO:zQcO1G/kO;RQcO1G/kO;YQcO1G/kOOQa1G/Q1G/QOOQa1G/O1G/OO!aQbO'#C{O;aQbO'#CwOOQ`,5:l,5:lOOQ`-E8O-E8OO;nQbO1G0uO;yQbO1G0vO<gQbO1G0wO;yQbO1G0xO<rQbO1G0yOOQ`1G/{1G/{O=VQbO7+&ZO;yQbO7+&]O=bQQO7+$uOOQa7+$u7+$uO=mQbO7+%UOOQa7+%U7+%UOOQO-E7{-E7{OOQ`-E7|-E7|O=wQbO'#D]O=|QQO'#D`OOQ`7+&a7+&aO>RQbO7+&aO>WQbO7+&aOOQ`'#D|'#D|O>`QQO'#D|O>eQbO'#EjO?XQbO7+&bOOQ`7+&c7+&cO?dQbO7+&cO?iQbO7+&cOOQ`'#D_'#D_O?qQbO7+&dOOQ`'#Do'#DoO?|QbO7+&eO@RQbO7+&fOOQ`<<Iu<<IuO@oQbO<<IuO@tQbO<<IuO@|QbO<<IwOOQa<<Ha<<HaOOQa<<Hp<<HpOAXQQO,59wOA^QbO,59zOOQ`<<I{<<I{OAqQbO<<I{OOQ`,5:h,5:hOOQ`-E7z-E7zOOQ`<<I|<<I|OAvQbO<<I|OA{QbO<<I|OOQ`<<I}<<I}OBTQbO<<I}OOQ`<<JO<<JOOBYQbO<<JOOB_QbO<<JOOOQ`<<JP<<JPOOQ`'#Dp'#DpOBgQbO<<JQOOQ`AN?aAN?aOBrQbOAN?aOOQ`AN?cAN?cOBwQbOAN?cOB|QbOAN?cOCUQbO1G/cOCiQbO1G/fOOQ`1G/f1G/fOOQ`AN?gAN?gOOQ`AN?hAN?hODPQbOAN?hOOQ`AN?iAN?iOOQ`AN?jAN?jODUQbOAN?jO-XQbO'#DqOOQ`'#ER'#ERODZQbOAN?lODfQQO'#DsOOQ`AN?lAN?lODkQbOAN?lOOQ`G24{G24{OOQ`G24}G24}ODpQbOG24}ODuQbO7+$}OOQ`7+$}7+$}OOQ`7+%Q7+%QOOQ`G25SG25SOOQ`G25UG25UOE`QRO,5:]OEgQRO,5:]OOQ`-E8P-E8POOQ`G25WG25WOErQbOG25WOEwQQO,5:_OOQ`LD*iLD*iOOQ`<<Hi<<HiOE|QQO1G/wOOQ`LD*rLD*rOCiQbO1G/yO@RQbO7+%cOOQ`7+%e7+%eOOQ`<<H}<<H}",
stateData: "Eh~O!vOS!wOS~OdPOehOfWOg_OhROmWOuWOvWO!VWO!]cO!_eO!afO!|^O#PQO#WTO#XUO#YkO~OdoOfWOg_OhROmWOuWOvWOynO!TpO!VWO!|^O#PQO#WTO#XUO!YoX#YoX#goX#_oX!OoX!RoX!SoX~OP!}XQ!}XR!}XS!}XT!}XU!}XW!}XX!}XY!}XZ!}X[!}X]!}X^!}X|oX~P!aOrvO#PyO#RtO#SuO~OdzO|{P~OdoOfWOg_OmWOuWOvWOynO!VWO!|^O#PQO#WTO#XUO#Y}O~O#^!QO~P%[OP#OXQ#OXR#OXS#OXT#OXU#OXW#OXX#OXY#OXZ#OX[#OX]#OX^#OX#Y#OX#g#OX!O#OX!R#OX!S#OX~OdoOfWOg_OhROmWOuWOvWOynO!TpO!VWO!|^O#PQO#WTO#XUO#_#OX~P&^OV!SO~P&^OP!}XQ!}XR!}XS!}XT!}XU!}XW!}XX!}XY!}XZ!}X[!}X]!}X^!}X~O#Y!yX#g!yX!O!yX!R!yX!S!yX~P(rOP!UOQ!UOR!VOS!VOT!XOU!YOW!WOX!WOY!WOZ!WO[!WO]!WO^!TO~O#Y!yX#g!yX!O!yX!R!yX!S!yX~OP!UOQ!UOR!VOS!VO~P*{OT!XOU!YO~P*{OdPOfWOg_OhROmWOuWOvWO!VWO!|^O#PQO#WTO#XUO~O!{!`O~O|!cO!Y!aO~P*{O|!dO~OdoOfWOg_OmWOuWOvWO!VWO!|^O#PQO#WTO#XUO~OV!SO_!jO`!jOa!jOb!jOc!jO~O#Y!kO#g!kO~OhRO!T!mO~P-UOhROynO!TpO|ka!Yka#Yka#gka#_ka!Oka!Rka!Ska~P-UOd!oO!|^O~O#P!pO#R!pO#S!pO#T!pO#U!pO#V!pO~OrvO#P!rO#RtO#SuO~OdzO|{X~O|!tO~O#^!wO~P%[OynO#Y!yO#^!{O~O#Y!|O#^!wO~P-UOehO!]cO!_eO!afO~P+xO#_#XO~P(rOP!UOQ!UOR!VOS!VO#_#XO~OT!XOU!YO#_#XO~O!Y!aO#_#XO~Od#YOm#YO!|^O~Od#ZOg_O!|^O~O!Y!aO#Yja#gja#_ja!Oja!Rja!Sja~OehO!]cO!_eO!afO#Y#`O~P+xOehO!]cO!_eO!afO#Y#bO~P+xO#Y!^a#g!^a!O!^a!R!^a!S!^a~P*QO#Y!^a#g!^a!O!^a!R!^a!S!^a~OP!UOQ!UOR!VOS!VO~P4vOT!XOU!YO~P4vOT!XOU!YOW!WOX!WOY!WOZ!WO[!WO]!WO~O|#cO~P5sOT!XOU!YO|#cO~OehO!]cO!_eO!afO#Y#fO~P+xOynO#Y!yO#^#hO~O#Y!|O#^#jO~P-UO^!TORpiSpi#Ypi#gpi#_pi!Opi!Rpi!Spi~OPpiQpi~P7kOP!UOQ!UO~P7kOP!UOQ!UORpiSpi#Ypi#gpi#_pi!Opi!Rpi!Spi~OW!WOX!WOY!WOZ!WO[!WO]!WOT!Wi#Y!Wi#g!Wi#_!Wi|!Wi!O!Wi!R!Wi!S!Wi~OU!YO~P9`OU!YO~P9rOU!Wi~P9`OhROynO!TpO~P-UO!O#mO!R#nO!S#oO~OehO!]cO!_eO!afO#Y#rO!O#[P!R#[P!S#[P~P+xO!O#mO!R#nO!S#vO~OehO!]cO!_eO!afO#Y#}O~P+xO!O#mO!R#nO!S$OO~OynO#Y!yO#^$SO~O#Y!|O#^$TO~P-UOd$UO~O|$VO~O!S$WO~O!R#nO!S$WO~O#Y$YO~OehO!]cO!_eO!afO#Y#rO!O#[X!R#[X!S#[X!e#[X!g#[X~P+xO!O#mO!R#nO!S$[O~O!S$_O~O!R#nO!S$_O~O!O#mO!R#nO!S$aO~O!S$dO~OehO!]cO!_eO!afO#Y#rO!S#[P!e#[P!g#[P~P+xO!S$gO~O!R#nO!S$gO~O!O#mO!R#nO!S$iO~O|$lO~OehO!]cO!_eO!afO#Y$mO~P+xO!S$oO~O!S$pO~O!R#nO!S$pO~O!S$rO~O!S$sO~O!R#nO!S$sO~O!S$yO!e$uO!g$xO~O!S${O~O!S$|O~O!R#nO!S$|O~OehO!]cO!_eO!afO#Y%OO~P+xOehO!]cO!_eO!afO#Y#rO!S#[P~P+xO!S%RO~O!S%SO~O!S%WO!e$uO!g$xO~O|%YO~O!S%WO~O!S%ZO~OehO!]cO!_eO!afO#Y#rO!R#[P!S#[P~P+xO|%]O~P5sOT!XOU!YO|%]O~O!S%^O~O#Y%_O~O#Y%`O~Omv~", stateData: "FU~O!xOS!yOS~OdPOehOfWOg_OhROmWOuWOvWO}WO!^cO!`eO!bfO#O^O#RQO#YTO#ZUO#[kO~OdoOfWOg_OhROmWOuWOvWOynO}WO!VpO#O^O#RQO#YTO#ZUO!ZoX#[oX#ioX#aoX!QoX!ToX!UoX~OP#PXQ#PXR#PXS#PXT#PXU#PXW#PXX#PXY#PXZ#PX[#PX]#PX^#PX!OoX~P!aOrvO#RyO#TtO#UuO~OdzOy|O!O{P~OdoOfWOg_OmWOuWOvWOynO}WO#O^O#RQO#YTO#ZUO#[!QO~O#`!TO~P%_OP#QXQ#QXR#QXS#QXT#QXU#QXW#QXX#QXY#QXZ#QX[#QX]#QX^#QX#[#QX#i#QX!Q#QX!T#QX!U#QX~OdoOfWOg_OhROmWOuWOvWOynO}WO!VpO#O^O#RQO#YTO#ZUO#a#QX~P&aOV!VO~P&aOP#PXQ#PXR#PXS#PXT#PXU#PXW#PXX#PXY#PXZ#PX[#PX]#PX^#PX~O#[!{X#i!{X!Q!{X!T!{X!U!{X~P(uOP!XOQ!XOR!YOS!YOT![OU!]OW!ZOX!ZOY!ZOZ!ZO[!ZO]!ZO^!WO~O#[!{X#i!{X!Q!{X!T!{X!U!{X~OP!XOQ!XOR!YOS!YO~P+OOT![OU!]O~P+OOdPOfWOg_OhROmWOuWOvWO}WO#O^O#RQO#YTO#ZUO~O!}!cO~O!O!fO!Z!dO~P+OO!O!gO~OdoOfWOg_OmWOuWOvWO}WO#O^O#RQO#YTO#ZUO~OV!VO_!mO`!mOa!mOb!mOc!mO~O#[!nO#i!nO~OhRO!V!pO~P-XOhROynO!VpO!Oka!Zka#[ka#ika#aka!Qka!Tka!Uka~P-XOd!rO#O^O~O#R!sO#T!sO#U!sO#V!sO#W!sO#X!sO~OrvO#R!uO#TtO#UuO~OdzOy|O!O{X~Om!xOu!xO}!xO#RQO~O!O!zO~O#`!}O~P%_OynO#[#PO#`#RO~O#[#SO#`!}O~P-XOehO!^cO!`eO!bfO~P+{O#a#_O~P(uOP!XOQ!XOR!YOS!YO#a#_O~OT![OU!]O#a#_O~O!Z!dO#a#_O~Od#`Om#`O#O^O~Od#aOg_O#O^O~O!Z!dO#[ja#ija#aja!Qja!Tja!Uja~OehO!^cO!`eO!bfO#[#fO~P+{OehO!^cO!`eO!bfO#[#hO~P+{O#[!_a#i!_a!Q!_a!T!_a!U!_a~P*TO#[!_a#i!_a!Q!_a!T!_a!U!_a~OP!XOQ!XOR!YOS!YO~P5[OT![OU!]O~P5[OT![OU!]OW!ZOX!ZOY!ZOZ!ZO[!ZO]!ZO~O!O#iO~P6XOT![OU!]O!O#iO~Oy|O!O{a~OehO!^cO!`eO!bfO#[#lO~P+{OynO#[#PO#`#nO~O#[#SO#`#pO~P-XO^!WORpiSpi#[pi#ipi#api!Qpi!Tpi!Upi~OPpiQpi~P8XOP!XOQ!XO~P8XOP!XOQ!XORpiSpi#[pi#ipi#api!Qpi!Tpi!Upi~OW!ZOX!ZOY!ZOZ!ZO[!ZO]!ZOT!Xi#[!Xi#i!Xi#a!Xi!O!Xi!Q!Xi!T!Xi!U!Xi~OU!]O~P9|OU!]O~P:`OU!Xi~P9|OhROynO!VpO~P-XO!Q#sO!T#tO!U#uO~OehO!^cO!`eO!bfO#[#xO!Q#^P!T#^P!U#^P~P+{O!Q#sO!T#tO!U#|O~OehO!^cO!`eO!bfO#[$TO~P+{O!Q#sO!T#tO!U$UO~OynO#[#PO#`$YO~O#[#SO#`$ZO~P-XOd$[O~O!O$]O~O!U$^O~O!T#tO!U$^O~O#[$`O~OehO!^cO!`eO!bfO#[#xO!Q#^X!T#^X!U#^X!f#^X!h#^X~P+{O!Q#sO!T#tO!U$bO~O!U$eO~O!T#tO!U$eO~O!Q#sO!T#tO!U$gO~O!U$jO~OehO!^cO!`eO!bfO#[#xO!U#^P!f#^P!h#^P~P+{O!U$mO~O!T#tO!U$mO~O!Q#sO!T#tO!U$oO~O!O$rO~OehO!^cO!`eO!bfO#[$sO~P+{O!U$uO~O!U$vO~O!T#tO!U$vO~O!U$xO~O!U$yO~O!T#tO!U$yO~O!U%PO!f${O!h%OO~O!U%RO~O!U%SO~O!T#tO!U%SO~OehO!^cO!`eO!bfO#[%UO~P+{OehO!^cO!`eO!bfO#[#xO!U#^P~P+{O!U%XO~O!U%YO~O!U%^O!f${O!h%OO~O!O%`O~O!U%^O~O!U%aO~OehO!^cO!`eO!bfO#[#xO!T#^P!U#^P~P+{O!O%cO~P6XOT![OU!]O!O%cO~O!U%dO~O#[%eO~O#[%fO~Omv~",
goto: "6a#gPPPPPPPPPPPPPPPPPPPPPPPPPP#h$Q$iP%k$Q&s'fP(c(cPP'f(gP(z)nP)qP*T*^PPP+SP,R,zP-R-RP-RP-RP-h-k-tP-xP-R-R.O.U.[.b.h.u/P/Z/d/kPPPP/q/u0nPP1Z2tP3uPPPPPPPP3y4g3yPP4w5O5O5e5e5z5zviOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`R!^^{`O^m!S!a!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`xPO^m!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`zoPUVefns!O!R!T!U!V!W!X!Y!x!}#Z#[#i$uR#Z!axVO^m!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`zWPUVefns!O!R!T!U!V!W!X!Y!x!}#Z#[#i$uQ!otQ#Y!`R#[!av[Om!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`Q![^Q!feQ#P!UR#S!V!uWOPUV^efmns!O!R!S!T!U!V!W!X!Y!c!d!j!t!x!}#Z#[#`#b#c#f#i#t#}$V$l$m$u%O%_%`TvQxYqPVs#Z#[Q!PUQ!v!OX!y!P!v!z#gviOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`YpPVs#Z#[Q!^^R!mnR|RQ#q#_Q#x#aQ$Q#eQ$^#uQ$c#zR$k$RQ#z#bQ%Q$mR%[%OQ#p#_Q#w#aQ$P#eQ$X#qQ$]#uQ$`#xQ$b#zQ$h$QQ$j$RQ$q$^Q$t$cR$}$k|WPUV^efns!O!R!T!U!V!W!X!Y!x!}#Z#[#i$uwXOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`v]Om!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`Q!]^Q!geQ!ifQ#T!YQ#V!XR%U$uZqPVs#Z#[wiOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`R#|#cQ$f#}Q%a%_R%b%`T$v$f$wQ$z$fR%X$wQmOR!lmQxQR!qxQ!OUR!u!OQ{RR!s{`#t#`#b#f#}$m%O%_%`R$Z#tQ!z!PQ#g!vT#k!z#gQ!}!RQ#i!xT#l!}#iWsPV#Z#[R!nsS!ba!_R#^!bQ$w$fR%V$wTlOmSjOmQ#O!SQ#_!cQ#a!dQ#d!jQ#e!tb#s#`#b#f#t#}$m%O%_%`Q#{#cQ$n$VR%P$lvaOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`Q!_^R#]!axZO^m!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`YpPVs#Z#[Q!RUQ!eeQ!hfQ!mnQ!x!OW!|!R!x!}#iQ#P!TQ#Q!UQ#R!VQ#T!WQ#U!XQ#W!YR%T$uvYOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`zoPUVefns!O!R!T!U!V!W!X!Y!x!}#Z#[#i$uR!Z^TwQx!VSOPV^mns!S!c!d!j!t#Z#[#`#b#c#f#t#}$V$l$m%O%_%`Q#u#`U#y#b$m%OQ$R#fV$e#}%_%`ZrPVs#Z#[wbOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`wdOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`wgOm!S!c!d!j!t#`#b#c#f#t#}$V$l$m%O%_%`", goto: "7s#iPPPPPPPPPPPPPPPPPPPPPPPPPP#j$S$kP%m$S&u'hP(h(hPP(l)iP)|*p*sPP*yP+]+fPPP,[-Z.SP.Z.ZP.ZP.ZP.p.s.|P/QP.Z.Z/W/^/d/j/p/z0X0c0m0v0}PPPP1T1X2QPP2m4WP5XPPPPPPPP5]5y5]PP6Z6b6b6w6w7^7^viOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fR!a^{`O^m!V!d!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fxPO^m!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fzoPUVefns!R!U!W!X!Y!Z![!]#O#T#a#b#o${R#a!dxVO^m!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fzWPUVefns!R!U!W!X!Y!Z![!]#O#T#a#b#o${Q!rtQ#`!cR#b!dv[Om!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fQ!_^Q!ieQ#V!XR#Y!Y!tWOPUV^efmns!R!U!V!W!X!Y!Z![!]!f!g!m!z#O#T#a#b#f#h#i#l#o#z$T$]$r$s${%U%e%fR!x|TvQx!uWOPUV^efmns!R!U!V!W!X!Y!Z![!]!f!g!m!z#O#T#a#b#f#h#i#l#o#z$T$]$r$s${%U%e%fYqPVs#a#bQ!SUQ!|!RX#P!S!|#Q#mviOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fYpPVs#a#bQ!a^R!pnR!PRX}R{!O!wQ#w#eQ$O#gQ$W#kQ$d#{Q$i$QR$q$XQ$Q#hQ%W$sR%b%UQ#v#eQ#}#gQ$V#kQ$_#wQ$c#{Q$f$OQ$h$QQ$n$WQ$p$XQ$w$dQ$z$iR%T$q|WPUV^efns!R!U!W!X!Y!Z![!]#O#T#a#b#o${wXOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fv]Om!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fQ!`^Q!jeQ!lfQ#Z!]Q#]![R%[${ZqPVs#a#bwiOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fR$S#iQ$l$TQ%g%eR%h%fT$|$l$}Q%Q$lR%_$}QmOR!omQxQR!txQ!RUR!{!RQ{RR!v{Q!ORQ!w{T!y!O!w`#z#f#h#l$T$s%U%e%fR$a#zQ#Q!SQ#m!|T#q#Q#mQ#T!UQ#o#OT#r#T#oWsPV#a#bR!qsS!ea!bR#d!eQ$}$lR%]$}TlOmSjOmQ#U!VQ#e!fQ#g!gQ#j!mQ#k!zb#y#f#h#l#z$T$s%U%e%fQ$R#iQ$t$]R%V$rvaOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fQ!b^R#c!dxZO^m!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fYpPVs#a#bQ!UUQ!heQ!kfQ!pnQ#O!RW#S!U#O#T#oQ#V!WQ#W!XQ#X!YQ#Z!ZQ#[![Q#^!]R%Z${vYOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fzoPUVefns!R!U!W!X!Y!Z![!]#O#T#a#b#o${R!^^TwQx!VSOPV^mns!V!f!g!m!z#a#b#f#h#i#l#z$T$]$r$s%U%e%fQ#{#fU$P#h$s%UQ$X#lV$k$T%e%fZrPVs#a#bwbOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fwdOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%fwgOm!V!f!g!m!z#f#h#i#l#z$T$]$r$s%U%e%f",
nodeNames: "⚠ Star Slash Plus Minus And Or Eq EqEq Neq Lt Lte Gt Gte Modulo PlusEq MinusEq StarEq SlashEq ModuloEq Identifier AssignableIdentifier Word IdentifierBeforeDot Do Program PipeExpr FunctionCall DotGet Number ParenExpr FunctionCallOrIdentifier BinOp String StringFragment Interpolation EscapeSeq Boolean Regex Dict NamedArg NamedArgPrefix FunctionDef Params colon CatchExpr keyword TryBlock FinallyExpr keyword keyword Underscore Array Null ConditionalOp PositionalArg operator FunctionCallWithBlock TryExpr keyword Throw keyword IfExpr keyword SingleLineThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword CompoundAssign Assign", nodeNames: "⚠ Star Slash Plus Minus And Or Eq EqEq Neq Lt Lte Gt Gte Modulo PlusEq MinusEq StarEq SlashEq ModuloEq Identifier AssignableIdentifier Word IdentifierBeforeDot Do Program PipeExpr FunctionCall DotGet Number ParenExpr FunctionCallOrIdentifier BinOp String StringFragment Interpolation EscapeSeq Boolean Regex Dict NamedArg NamedArgPrefix FunctionDef Params NamedParam Null colon CatchExpr keyword TryBlock FinallyExpr keyword keyword Underscore Array ConditionalOp PositionalArg operator FunctionCallWithBlock TryExpr keyword Throw keyword IfExpr keyword SingleLineThenBlock ThenBlock ElseIfExpr keyword ElseExpr keyword CompoundAssign Assign",
maxTerm: 115, maxTerm: 117,
context: trackScope, context: trackScope,
nodeProps: [ nodeProps: [
["closedBy", 44,"end"] ["closedBy", 46,"end"]
], ],
propSources: [highlighting], propSources: [highlighting],
skippedNodes: [0], skippedNodes: [0],
repeatNodeCount: 10, repeatNodeCount: 11,
tokenData: "C_~R|OX#{XY$jYZ%TZp#{pq$jqs#{st%ntu'Vuw#{wx'[xy'ayz'zz{#{{|(e|}#{}!O+X!O!P#{!P!Q-n!Q![)S![!]6Z!]!^%T!^!}#{!}#O6t#O#P8j#P#Q8o#Q#R#{#R#S9Y#S#T#{#T#Y,Y#Y#Z9s#Z#b,Y#b#c>q#c#f,Y#f#g?n#g#h,Y#h#i@k#i#o,Y#o#p#{#p#qBo#q;'S#{;'S;=`$d<%l~#{~O#{~~CYS$QUrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{S$gP;=`<%l#{^$qUrS!vYOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UrS#YQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZrS!wYOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!wYOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O#R~~'aO#P~U'hUrS!|QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUrS#_QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(jWrSOt#{uw#{x!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U)ZYrSmQOt#{uw#{x!O#{!O!P)y!P!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U*OWrSOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U*oWrSmQOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U+^^rSOt#{uw#{x}#{}!O,Y!O!Q#{!Q![)S![!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U,_[rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U-[UyQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U-sWrSOt#{uw#{x!P#{!P!Q.]!Q#O#{#P;'S#{;'S;=`$d<%lO#{U.b^rSOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q#{!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^U/e^rSvQOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q3U!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^Q0fXvQOY0aZ!P0a!P!Q1R!Q!}0a!}#O1p#O#P2o#P;'S0a;'S;=`3O<%lO0aQ1UP!P!Q1XQ1^UvQ#Z#[1X#]#^1X#a#b1X#g#h1X#i#j1X#m#n1XQ1sVOY1pZ#O1p#O#P2Y#P#Q0a#Q;'S1p;'S;=`2i<%lO1pQ2]SOY1pZ;'S1p;'S;=`2i<%lO1pQ2lP;=`<%l1pQ2rSOY0aZ;'S0a;'S;=`3O<%lO0aQ3RP;=`<%l0aU3ZWrSOt#{uw#{x!P#{!P!Q3s!Q#O#{#P;'S#{;'S;=`$d<%lO#{U3zbrSvQOt#{uw#{x#O#{#P#Z#{#Z#[3s#[#]#{#]#^3s#^#a#{#a#b3s#b#g#{#g#h3s#h#i#{#i#j3s#j#m#{#m#n3s#n;'S#{;'S;=`$d<%lO#{U5X[rSOY5SYZ#{Zt5Stu1puw5Swx1px#O5S#O#P2Y#P#Q/^#Q;'S5S;'S;=`5}<%lO5SU6QP;=`<%l5SU6WP;=`<%l/^U6bUrS|QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U6{W#XQrSOt#{uw#{x!_#{!_!`7e!`#O#{#P;'S#{;'S;=`$d<%lO#{U7jVrSOt#{uw#{x#O#{#P#Q8P#Q;'S#{;'S;=`$d<%lO#{U8WU#WQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~8oO#S~U8vU#^QrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9aUrS!TQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9x]rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#U:q#U#o,Y#o;'S#{;'S;=`$d<%lO#{U:v^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#`,Y#`#a;r#a#o,Y#o;'S#{;'S;=`$d<%lO#{U;w^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#g,Y#g#h<s#h#o,Y#o;'S#{;'S;=`$d<%lO#{U<x^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#X,Y#X#Y=t#Y#o,Y#o;'S#{;'S;=`$d<%lO#{U={[uQrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^>x[#TWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^?u[#VWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^@r^#UWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#f,Y#f#gAn#g#o,Y#o;'S#{;'S;=`$d<%lO#{UAs^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#i,Y#i#j<s#j#o,Y#o;'S#{;'S;=`$d<%lO#{UBvU!YQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~C_O#g~", tokenData: "C_~R|OX#{XY$jYZ%TZp#{pq$jqs#{st%ntu'Vuw#{wx'[xy'ayz'zz{#{{|(e|}#{}!O+X!O!P#{!P!Q-n!Q![)S![!]6Z!]!^%T!^!}#{!}#O6t#O#P8j#P#Q8o#Q#R#{#R#S9Y#S#T#{#T#Y,Y#Y#Z9s#Z#b,Y#b#c>q#c#f,Y#f#g?n#g#h,Y#h#i@k#i#o,Y#o#p#{#p#qBo#q;'S#{;'S;=`$d<%l~#{~O#{~~CYS$QUrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{S$gP;=`<%l#{^$qUrS!xYOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U%[UrS#[QOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{^%uZrS!yYOY%nYZ#{Zt%ntu&huw%nwx&hx#O%n#O#P&h#P;'S%n;'S;=`'P<%lO%nY&mS!yYOY&hZ;'S&h;'S;=`&y<%lO&hY&|P;=`<%l&h^'SP;=`<%l%n~'[O#T~~'aO#R~U'hUrS#OQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(RUrS#aQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U(jWrSOt#{uw#{x!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U)ZYrSmQOt#{uw#{x!O#{!O!P)y!P!Q#{!Q![)S![#O#{#P;'S#{;'S;=`$d<%lO#{U*OWrSOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U*oWrSmQOt#{uw#{x!Q#{!Q![*h![#O#{#P;'S#{;'S;=`$d<%lO#{U+^^rSOt#{uw#{x}#{}!O,Y!O!Q#{!Q![)S![!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U,_[rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{U-[UyQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U-sWrSOt#{uw#{x!P#{!P!Q.]!Q#O#{#P;'S#{;'S;=`$d<%lO#{U.b^rSOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q#{!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^U/e^rSvQOY/^YZ#{Zt/^tu0auw/^wx0ax!P/^!P!Q3U!Q!}/^!}#O5S#O#P2o#P;'S/^;'S;=`6T<%lO/^Q0fXvQOY0aZ!P0a!P!Q1R!Q!}0a!}#O1p#O#P2o#P;'S0a;'S;=`3O<%lO0aQ1UP!P!Q1XQ1^UvQ#Z#[1X#]#^1X#a#b1X#g#h1X#i#j1X#m#n1XQ1sVOY1pZ#O1p#O#P2Y#P#Q0a#Q;'S1p;'S;=`2i<%lO1pQ2]SOY1pZ;'S1p;'S;=`2i<%lO1pQ2lP;=`<%l1pQ2rSOY0aZ;'S0a;'S;=`3O<%lO0aQ3RP;=`<%l0aU3ZWrSOt#{uw#{x!P#{!P!Q3s!Q#O#{#P;'S#{;'S;=`$d<%lO#{U3zbrSvQOt#{uw#{x#O#{#P#Z#{#Z#[3s#[#]#{#]#^3s#^#a#{#a#b3s#b#g#{#g#h3s#h#i#{#i#j3s#j#m#{#m#n3s#n;'S#{;'S;=`$d<%lO#{U5X[rSOY5SYZ#{Zt5Stu1puw5Swx1px#O5S#O#P2Y#P#Q/^#Q;'S5S;'S;=`5}<%lO5SU6QP;=`<%l5SU6WP;=`<%l/^U6bUrS!OQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U6{W#ZQrSOt#{uw#{x!_#{!_!`7e!`#O#{#P;'S#{;'S;=`$d<%lO#{U7jVrSOt#{uw#{x#O#{#P#Q8P#Q;'S#{;'S;=`$d<%lO#{U8WU#YQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~8oO#U~U8vU#`QrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9aUrS!VQOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{U9x]rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#U:q#U#o,Y#o;'S#{;'S;=`$d<%lO#{U:v^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#`,Y#`#a;r#a#o,Y#o;'S#{;'S;=`$d<%lO#{U;w^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#g,Y#g#h<s#h#o,Y#o;'S#{;'S;=`$d<%lO#{U<x^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#X,Y#X#Y=t#Y#o,Y#o;'S#{;'S;=`$d<%lO#{U={[uQrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^>x[#VWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^?u[#XWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#o,Y#o;'S#{;'S;=`$d<%lO#{^@r^#WWrSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#f,Y#f#gAn#g#o,Y#o;'S#{;'S;=`$d<%lO#{UAs^rSOt#{uw#{x}#{}!O,Y!O!_#{!_!`-T!`#O#{#P#T#{#T#i,Y#i#j<s#j#o,Y#o;'S#{;'S;=`$d<%lO#{UBvU!ZQrSOt#{uw#{x#O#{#P;'S#{;'S;=`$d<%lO#{~C_O#i~",
tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!{~~", 11)], tokenizers: [operatorTokenizer, 1, 2, 3, tokenizer, new LocalTokenGroup("[~RP!O!PU~ZO!}~~", 11)],
topRules: {"Program":[0,25]}, topRules: {"Program":[0,25]},
specialized: [{term: 20, get: (value: any, stack: any) => (specializeKeyword(value, stack) << 1), external: specializeKeyword},{term: 20, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}], specialized: [{term: 20, get: (value: any, stack: any) => (specializeKeyword(value, stack) << 1), external: specializeKeyword},{term: 20, get: (value: keyof typeof spec_Identifier) => spec_Identifier[value] || -1}],
tokenPrec: 1677 tokenPrec: 1705
}) })

View File

@ -177,3 +177,58 @@ end`).toMatchTree(`
`) `)
}) })
}) })
describe('default params', () => {
test('parses function with single default parameter', () => {
expect('do x=1: x + 1 end').toMatchTree(`
FunctionDef
Do do
Params
NamedParam
NamedArgPrefix x=
Number 1
colon :
BinOp
Identifier x
Plus +
Number 1
keyword end`)
})
test('parses function with multiple default parameters', () => {
expect(`do x='something' y=true: x * y end`).toMatchTree(`
FunctionDef
Do do
Params
NamedParam
NamedArgPrefix x=
String
StringFragment something
NamedParam
NamedArgPrefix y=
Boolean true
colon :
BinOp
Identifier x
Star *
Identifier y
keyword end`)
})
test('parses function with mixed parameters', () => {
expect('do x y=true: x * y end').toMatchTree(`
FunctionDef
Do do
Params
Identifier x
NamedParam
NamedArgPrefix y=
Boolean true
colon :
BinOp
Identifier x
Star *
Identifier y
keyword end`)
})
})