diff --git a/README.md b/README.md index 19824e72..3fc10c4a 100644 --- a/README.md +++ b/README.md @@ -9,16 +9,22 @@ Simple script language for TRPG dice engine. 特性: +- 支持整数、浮点数、字符串、数组、字典、函数,常见算符以及if和while逻辑语句 +- 支持形如d20等的trpg用骰点语法 +- 全类型可序列化(包括函数在内) +- 对模板字符串语法做大量优化,可胜任模板引擎 - 易于使用,方便扩展 - 稳定可靠,极高的测试覆盖率 -- 免费,并可商用 -- 支持JavaScript -- 海豹TRPG骰点核心的第二代解释器 +- 免费并可商用 +- 可编译到JavaScript 测试页面: https://sealdice.github.io/dicescript/ +这个项目是海豹核心的骰点解释器的完全重构。 +从第一次实现中吸取了很多经验和教训,并尝试做得更好。 + ## 如何使用 [DiceScript指南](./GUIDE.md) @@ -28,20 +34,9 @@ https://sealdice.github.io/dicescript/ ## 设计原则 -先随便写一些想到的,然后再细化 - -这是未来SealDice项目的一部分,一次从零重构。 - -目前SealDice使用一个叫做RollVM的解释器来完成脚本语言的解析。 - -DiceScript将更好的实现骰点功能,语法规范化的同时,具有更好的接口设计和自定义能力。 - - -几个设计原则: - -* 从主流语言和跑团软件中借鉴语法,如Golang/Python/JS/Ruby/Fvtt/BCDice,不随意发明 -* 兼容中国大陆地区跑团指令的一般习惯 -* 要具有较强的配置和扩展能力,符合trpg场景额需求 +* 从主流语言和跑团软件中借鉴语法,如Golang/Python/JS/Fvtt/BCDice,不随意发明 +* 符合国内跑团指令的一般习惯 +* 要具有较强的配置和扩展能力,符合trpg场景的需求 * 一定限度内容忍全角符号 * 兼容gopherjs * 良好的错误提示文本 @@ -55,7 +50,7 @@ DiceScript将更好的实现骰点功能,语法规范化的同时,具有更 - [x] 二元算符 +-*/% >,>=,==,!=,<,<=,&,|,&&,|| - [x] 三元算符 ? : - [x] 空值合并算符 ?? -- [x] 骰点运算 流行: d20, 3d20, (4+5)d(20), 2d20k1, 2d20q1 +- [x] 骰点运算 - 流行语法: d20, 3d20, (4+5)d(20), 2d20k1, 2d20q1 - [x] 骰点运算 - fvtt语法: 2d20kl, 2d20kh, 2d20dl, 2d20dh, d20min10, d20max10 - [x] 骰点运算 - CoC / Fate / WoD / Double Cross - [ ] 骰点运算 - 自定义算符 @@ -75,7 +70,7 @@ DiceScript将更好的实现骰点功能,语法规范化的同时,具有更 - [x] 报错信息优化 - [x] 线程安全 - [x] 变量作用域 -- [ ] 测试覆盖率 85% / 90% +- [ ] 测试覆盖率 86% / 90% ## 更新记录 @@ -83,7 +78,7 @@ DiceScript将更好的实现骰点功能,语法规范化的同时,具有更 ## TODO -* ~~d2d(4d4d5)d6 计算过程问题~~ +* 骰点运算 - 自定义算符 ## 开发 diff --git a/parser.go b/parser.go index 7ec46e9e..21174aca 100644 --- a/parser.go +++ b/parser.go @@ -32,8 +32,9 @@ type BufferSpan struct { End IntType Ret *VMValue Text string - // 来源标记 - Tag string + + Expr string // 如果存在Expr,用来替代等号左边的内容,不存在的话用Begin和End从原文提取 + Tag string // 来源标记 } func (e *ParserData) LoopBegin() { diff --git a/roll.peg b/roll.peg index 10e9da6f..d77b676d 100644 --- a/roll.peg +++ b/roll.peg @@ -243,8 +243,8 @@ _diceMod <- ("kl" / [qQ]) nos { c.data.AddOp(typeDiceSetKeepLowNum); } // 这 _diceModType2 <- "min" nos { c.data.AddOp(typeDiceSetMin) } / "max" nos { c.data.AddOp(typeDiceSetMax) } -_dicePearMod <- "优势" { c.data.PushIntNumber("2"); c.data.AddOp(typeDiceSetTimes); c.data.PushIntNumber("1"); c.data.AddOp(typeDiceSetKeepHighNum); } - / "劣势" { c.data.PushIntNumber("2"); c.data.AddOp(typeDiceSetTimes); c.data.PushIntNumber("1"); c.data.AddOp(typeDiceSetKeepLowNum); } +_dicePearMod <- ("优势"/"優勢") { c.data.PushIntNumber("2"); c.data.AddOp(typeDiceSetTimes); c.data.PushIntNumber("1"); c.data.AddOp(typeDiceSetKeepHighNum); } + / ("劣势"/"劣勢") { c.data.PushIntNumber("2"); c.data.AddOp(typeDiceSetTimes); c.data.PushIntNumber("1"); c.data.AddOp(typeDiceSetKeepLowNum); } // 3d20, 3d20d2, 2d20优势 _diceType1 <- nos [dD] nos @@ -252,13 +252,14 @@ _diceType1 <- nos [dD] nos _diceType2 <- [dD] nos // 3d _diceType3 <- nos [dD] -// d -_diceType4 <- [dD] !xidStart +// d / d优势 / d劣势 +_diceType4 <- [dD] ("优势" / "優勢" / "劣势" / "劣勢" / !xidStart) // XdY/dY/Xd 中的 dy + 后缀部分,跟上面 _diceTypeX 一一对应 _diceExpr1 <- [dD] { c.data.AddOp(typeDiceInit); c.data.AddOp(typeDiceSetTimes); } nos _diceMod? _diceModType2? _diceExpr2 <- [dD] { c.data.AddOp(typeDiceInit); } nos (_dicePearMod / _diceMod)? _diceModType2? // 注: 这一条是 dY 而不是 xdY _diceExpr3 <- [dD] { c.data.AddOp(typeDiceInit); c.data.AddOp(typeDiceSetTimes); } _diceMod? _diceModType2? +_diceExpr4 <- [dD] { c.data.AddOp(typeDiceInit); c.data.AddOp(typeDiceSetTimes); } (_dicePearMod / _diceMod)? _diceModType2? // 多重式子 d4d6d8 _diceExprX <- &_diceType2 detailStart _diceExpr1 detailEnd { c.data.AddOp(typeDice) } @@ -283,7 +284,7 @@ _fateDiceType <- [fF] !xidContinue exprDice <- &_diceType1 detailStart nos _diceExpr1 detailEnd { c.data.AddOp(typeDice); } _diceExprX* / &_diceType2 detailStart _diceExpr2 detailEnd { c.data.AddOp(typeDice) } _diceExprX* / &{return !c.data.Config.DisableNDice} &_diceType3 detailStart nos _diceExpr3 detailEnd { c.data.AddOp(typePushDefaultExpr); c.data.AddOp(typeDice) } _diceExprX* - / &{return !c.data.Config.DisableNDice} &_diceType4 detailStart { c.data.PushIntNumber("1") } _diceExpr3 detailEnd { c.data.AddOp(typePushDefaultExpr); c.data.AddOp(typeDice) } _diceExprX* + / &{return !c.data.Config.DisableNDice} &_diceType4 detailStart { c.data.PushIntNumber("1") } _diceExpr4 detailEnd { c.data.AddOp(typePushDefaultExpr); c.data.AddOp(typeDice) } _diceExprX* / &{return c.data.Config.EnableDiceCoC} &_cocDiceType detailStart (_diceCocBonus / _diceCocPenalty) / &{return c.data.Config.EnableDiceWoD} &_wodDiceType detailStart { c.data.AddOp(typeWodSetInit) } (nos { c.data.AddOp(typeWodSetPool) } _wodMain / _wodMain !xidContinue) detailEnd { c.data.AddOp(typeDiceWod) } / &{return c.data.Config.EnableDiceDoubleCross} &_dcDiceType detailStart { c.data.AddOp(typeDCSetInit) } nos { c.data.AddOp(typeDCSetPool) } [cC] nos (([mM] nos { c.data.AddOp(typeDCSetPoints) }) )* detailEnd { c.data.AddOp(typeDiceDC) } diff --git a/roll.peg.go b/roll.peg.go index 01c5ae06..f6e624c2 100644 --- a/roll.peg.go +++ b/roll.peg.go @@ -39,9 +39,9 @@ var g = &grammar{ run: (*parser).call_ondicescript_1, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 1 /* stmtSt */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -53,7 +53,7 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &litMatcher{val: "^st", want: "\"^st\""}, - &ruleIRefExpr{index: 129 /* st_expr */}, + &ruleIRefExpr{index: 130 /* st_expr */}, }, }, &ruleIRefExpr{index: 2 /* stmtRoot */}, @@ -65,7 +65,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 3 /* stmtLines */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -92,8 +92,8 @@ var g = &grammar{ }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 126 /* comment */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 127 /* comment */}, + &ruleIRefExpr{index: 123 /* sp */}, &zeroOrOneExpr{ expr: &ruleIRefExpr{index: 3 /* stmtLines */}, }, @@ -113,7 +113,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ";", want: "\";\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -133,14 +133,14 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "//", want: "\"//\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "#EnableDice", want: "\"#EnableDice\""}, - &ruleIRefExpr{index: 124 /* sp1x */}, + &ruleIRefExpr{index: 125 /* sp1x */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 124 /* sp1x */}, + &ruleIRefExpr{index: 125 /* sp1x */}, &labeledExpr{ label: "on", expr: &choiceExpr{ @@ -151,7 +151,7 @@ var g = &grammar{ }, textCapture: true, }, - &ruleIRefExpr{index: 127 /* commentLineRest */}, + &ruleIRefExpr{index: 128 /* commentLineRest */}, }, }, }, @@ -188,19 +188,19 @@ var g = &grammar{ alternatives: []any{ &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 125 /* spNoCR */}, + &ruleIRefExpr{index: 126 /* spNoCR */}, &litMatcher{val: "\n", want: "\"\\n\""}, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: ";", want: "\";\""}, }, }, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -217,7 +217,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "break", want: "\"break\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -229,7 +229,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "continue", want: "\"continue\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -243,7 +243,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "return", want: "\"return\""}, - &ruleIRefExpr{index: 124 /* sp1x */}, + &ruleIRefExpr{index: 125 /* sp1x */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -253,7 +253,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "return", want: "\"return\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -272,9 +272,9 @@ var g = &grammar{ run: (*parser).call_onstmtWhile_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 124 /* sp1x */}, + &ruleIRefExpr{index: 125 /* sp1x */}, &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -294,21 +294,21 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "}", want: "\"}\""}, }, }, &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 2 /* stmtRoot */}, &litMatcher{val: "}", want: "\"}\""}, }, }, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -321,13 +321,13 @@ var g = &grammar{ alternatives: []any{ &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 12 /* block */}, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 124 /* sp1x */}, + &ruleIRefExpr{index: 125 /* sp1x */}, &ruleIRefExpr{index: 14 /* stmtIf */}, }, }, @@ -341,7 +341,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "if", want: "\"if\""}, - &ruleIRefExpr{index: 124 /* sp1x */}, + &ruleIRefExpr{index: 125 /* sp1x */}, &choiceExpr{ alternatives: []any{ &seqExpr{ @@ -351,7 +351,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -383,9 +383,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: ")", want: "\")\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -396,7 +396,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -406,9 +406,9 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -422,12 +422,12 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "id2", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -438,7 +438,7 @@ var g = &grammar{ }, }, &litMatcher{val: ")", want: "\")\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -456,12 +456,12 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "func", want: "\"func\""}, - &ruleIRefExpr{index: 124 /* sp1x */}, + &ruleIRefExpr{index: 125 /* sp1x */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -471,7 +471,7 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 15 /* func_def_params */}, &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -487,7 +487,7 @@ var g = &grammar{ textCapture: true, }, &litMatcher{val: "}", want: "\"}\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -505,9 +505,9 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -516,7 +516,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -536,9 +536,9 @@ var g = &grammar{ &litMatcher{val: "&", want: "\"&\""}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -547,7 +547,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -574,9 +574,9 @@ var g = &grammar{ &litMatcher{val: "&", want: "\"&\""}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -587,9 +587,9 @@ var g = &grammar{ &litMatcher{val: ".", want: "\".\""}, &labeledExpr{ label: "id2", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -597,9 +597,9 @@ var g = &grammar{ run: (*parser).call_onstmtAssignType3_14, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -617,14 +617,14 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "this", want: "\"this\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: ".", want: "\".\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -633,7 +633,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -652,9 +652,9 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -663,12 +663,12 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ".", want: "\".\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "id2", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -677,7 +677,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -693,12 +693,12 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 30 /* exprSlice */}, &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -713,7 +713,7 @@ var g = &grammar{ &ruleIRefExpr{index: 30 /* exprSlice */}, &ruleIRefExpr{index: 28 /* _sliceSuffix */}, &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -791,8 +791,8 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 102 /* subX */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 103 /* subX */}, + &ruleIRefExpr{index: 123 /* sp */}, &charClassMatcher{ val: "[-+*/%^dDcCaA&|?<>=]", chars: []rune{'-', '+', '*', '/', '%', '^', 'd', 'D', 'c', 'C', 'a', 'A', '&', '|', '?', '<', '>', '='}, @@ -811,9 +811,9 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &andExpr{ - expr: &ruleIRefExpr{index: 102 /* subX */}, + expr: &ruleIRefExpr{index: 103 /* subX */}, }, - &ruleIRefExpr{index: 102 /* subX */}, + &ruleIRefExpr{index: 103 /* subX */}, }, }, }, @@ -836,13 +836,13 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &litMatcher{val: ":", want: "\":\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, &actionExpr{ run: (*parser).call_on_step_7, - expr: &ruleIRefExpr{index: 122 /* sp */}, + expr: &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -850,7 +850,7 @@ var g = &grammar{ }, &actionExpr{ run: (*parser).call_on_step_9, - expr: &ruleIRefExpr{index: 122 /* sp */}, + expr: &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -860,31 +860,31 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, &actionExpr{ run: (*parser).call_on_sliceSuffix_6, - expr: &ruleIRefExpr{index: 122 /* sp */}, + expr: &ruleIRefExpr{index: 123 /* sp */}, }, }, }, &litMatcher{val: ":", want: "\":\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, &actionExpr{ run: (*parser).call_on_sliceSuffix_12, - expr: &ruleIRefExpr{index: 122 /* sp */}, + expr: &ruleIRefExpr{index: 123 /* sp */}, }, }, }, &ruleIRefExpr{index: 27 /* _step */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -928,9 +928,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "?", want: "\"?\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -939,7 +939,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -955,9 +955,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "?", want: "\"?\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -966,9 +966,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: ":", want: "\":\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -977,7 +977,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -1000,7 +1000,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 31 /* exprValueIfExists */}, }, }, @@ -1046,8 +1046,8 @@ var g = &grammar{ run: (*parser).call_onexprLogicOr_5, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 114 /* logicOr */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 115 /* logicOr */}, }, }, }, @@ -1074,8 +1074,8 @@ var g = &grammar{ run: (*parser).call_onexprLogicAnd_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 115 /* logicAnd */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 116 /* logicAnd */}, &ruleIRefExpr{index: 37 /* exprBitwiseOr */}, }, }, @@ -1102,8 +1102,8 @@ var g = &grammar{ run: (*parser).call_onexprBitwiseOr_8, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 112 /* bitwiseOr */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 113 /* bitwiseOr */}, &ruleIRefExpr{index: 38 /* exprBitwiseAnd */}, }, }, @@ -1124,8 +1124,8 @@ var g = &grammar{ run: (*parser).call_onexprBitwiseAnd_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 113 /* bitwiseAnd */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 114 /* bitwiseAnd */}, &ruleIRefExpr{index: 39 /* exprCompare */}, }, }, @@ -1142,14 +1142,14 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ run: (*parser).call_onexprCompare_7, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 116 /* lt */}, + &ruleIRefExpr{index: 117 /* lt */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1158,7 +1158,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_11, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 118 /* le */}, + &ruleIRefExpr{index: 119 /* le */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1167,7 +1167,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_15, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 120 /* eq */}, + &ruleIRefExpr{index: 121 /* eq */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1176,7 +1176,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_19, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 121 /* ne */}, + &ruleIRefExpr{index: 122 /* ne */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1185,7 +1185,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_23, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 119 /* ge */}, + &ruleIRefExpr{index: 120 /* ge */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1194,7 +1194,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_27, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 117 /* gt */}, + &ruleIRefExpr{index: 118 /* gt */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1215,14 +1215,14 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ run: (*parser).call_onexprAdditive_7, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 105 /* add */}, + &ruleIRefExpr{index: 106 /* add */}, &ruleIRefExpr{index: 41 /* exprMultiplicative */}, }, }, @@ -1231,7 +1231,7 @@ var g = &grammar{ run: (*parser).call_onexprAdditive_11, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 106 /* minus */}, + &ruleIRefExpr{index: 107 /* minus */}, &ruleIRefExpr{index: 41 /* exprMultiplicative */}, }, }, @@ -1252,14 +1252,14 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ run: (*parser).call_onexprMultiplicative_7, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 107 /* multiply */}, + &ruleIRefExpr{index: 108 /* multiply */}, &ruleIRefExpr{index: 43 /* exprExp */}, }, }, @@ -1268,7 +1268,7 @@ var g = &grammar{ run: (*parser).call_onexprMultiplicative_11, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 108 /* divide */}, + &ruleIRefExpr{index: 109 /* divide */}, &ruleIRefExpr{index: 43 /* exprExp */}, }, }, @@ -1277,7 +1277,7 @@ var g = &grammar{ run: (*parser).call_onexprMultiplicative_15, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 109 /* modulus */}, + &ruleIRefExpr{index: 110 /* modulus */}, &ruleIRefExpr{index: 43 /* exprExp */}, }, }, @@ -1300,8 +1300,8 @@ var g = &grammar{ run: (*parser).call_onexprNullCoalescing_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 111 /* nullCoalescing */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 112 /* nullCoalescing */}, &ruleIRefExpr{index: 43 /* exprExp */}, }, }, @@ -1320,8 +1320,8 @@ var g = &grammar{ run: (*parser).call_onexprExp_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 110 /* exponentiation */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 111 /* exponentiation */}, &ruleIRefExpr{index: 44 /* exprUnaryNeg */}, }, }, @@ -1338,8 +1338,8 @@ var g = &grammar{ run: (*parser).call_onexprUnaryNeg_2, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 106 /* minus */}, - &ruleIRefExpr{index: 68 /* exprDice */}, + &ruleIRefExpr{index: 107 /* minus */}, + &ruleIRefExpr{index: 69 /* exprDice */}, }, }, }, @@ -1355,12 +1355,12 @@ var g = &grammar{ run: (*parser).call_onexprUnaryPos_2, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 105 /* add */}, - &ruleIRefExpr{index: 68 /* exprDice */}, + &ruleIRefExpr{index: 106 /* add */}, + &ruleIRefExpr{index: 69 /* exprDice */}, }, }, }, - &ruleIRefExpr{index: 68 /* exprDice */}, + &ruleIRefExpr{index: 69 /* exprDice */}, }, }, }, @@ -1368,8 +1368,8 @@ var g = &grammar{ name: "nos", expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 80 /* number */}, - &ruleIRefExpr{index: 101 /* sub */}, + &ruleIRefExpr{index: 81 /* number */}, + &ruleIRefExpr{index: 102 /* sub */}, }, }, }, @@ -1506,12 +1506,22 @@ var g = &grammar{ expr: &choiceExpr{ alternatives: []any{ &actionExpr{ - run: (*parser).call_on_dicePearMod_2, - expr: &litMatcher{val: "优势", want: "\"优势\""}, + run: (*parser).call_on_dicePearMod_2, + expr: &choiceExpr{ + alternatives: []any{ + &litMatcher{val: "优势", want: "\"优势\""}, + &litMatcher{val: "優勢", want: "\"優勢\""}, + }, + }, }, &actionExpr{ - run: (*parser).call_on_dicePearMod_4, - expr: &litMatcher{val: "劣势", want: "\"劣势\""}, + run: (*parser).call_on_dicePearMod_6, + expr: &choiceExpr{ + alternatives: []any{ + &litMatcher{val: "劣势", want: "\"劣势\""}, + &litMatcher{val: "劣勢", want: "\"劣勢\""}, + }, + }, }, }, }, @@ -1561,8 +1571,16 @@ var g = &grammar{ val: "[dD]", chars: []rune{'d', 'D'}, }, - ¬Expr{ - expr: &ruleIRefExpr{index: 99 /* xidStart */}, + &choiceExpr{ + alternatives: []any{ + &litMatcher{val: "优势", want: "\"优势\""}, + &litMatcher{val: "優勢", want: "\"優勢\""}, + &litMatcher{val: "劣势", want: "\"劣势\""}, + &litMatcher{val: "劣勢", want: "\"劣勢\""}, + ¬Expr{ + expr: &ruleIRefExpr{index: 100 /* xidStart */}, + }, + }, }, }, }, @@ -1646,6 +1664,35 @@ var g = &grammar{ }, }, }, + { + name: "_diceExpr4", + expr: &seqExpr{ + exprs: []any{ + &actionExpr{ + run: (*parser).call_on_diceExpr4_2, + expr: &charClassMatcher{ + val: "[dD]", + chars: []rune{'d', 'D'}, + }, + }, + &seqExpr{ + exprs: []any{ + &zeroOrOneExpr{ + expr: &choiceExpr{ + alternatives: []any{ + &ruleIRefExpr{index: 51 /* _dicePearMod */}, + &ruleIRefExpr{index: 49 /* _diceMod */}, + }, + }, + }, + &zeroOrOneExpr{ + expr: &ruleIRefExpr{index: 50 /* _diceModType2 */}, + }, + }, + }, + }, + }, + }, { name: "_diceExprX", expr: &actionExpr{ @@ -1714,14 +1761,14 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 46 /* nos */}, - &ruleIRefExpr{index: 60 /* _wodTypeMain */}, + &ruleIRefExpr{index: 61 /* _wodTypeMain */}, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 60 /* _wodTypeMain */}, + &ruleIRefExpr{index: 61 /* _wodTypeMain */}, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, @@ -1796,12 +1843,12 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 46 /* nos */}, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, @@ -1824,14 +1871,14 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 46 /* nos */}, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, &actionExpr{ run: (*parser).call_on_diceCocBonus_9, expr: ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, @@ -1857,14 +1904,14 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 46 /* nos */}, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, &actionExpr{ run: (*parser).call_on_diceCocPenalty_9, expr: ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, @@ -1907,7 +1954,7 @@ var g = &grammar{ chars: []rune{'f', 'F'}, }, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, @@ -1933,7 +1980,7 @@ var g = &grammar{ }, }, &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 59 /* _diceExprX */}, + expr: &ruleIRefExpr{index: 60 /* _diceExprX */}, }, }, }, @@ -1953,7 +2000,7 @@ var g = &grammar{ }, }, &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 59 /* _diceExprX */}, + expr: &ruleIRefExpr{index: 60 /* _diceExprX */}, }, }, }, @@ -1975,7 +2022,7 @@ var g = &grammar{ }, }, &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 59 /* _diceExprX */}, + expr: &ruleIRefExpr{index: 60 /* _diceExprX */}, }, }, }, @@ -1997,13 +2044,13 @@ var g = &grammar{ run: (*parser).call_onexprDice_42, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 58 /* _diceExpr3 */}, + &ruleIRefExpr{index: 59 /* _diceExpr4 */}, &ruleIRefExpr{index: 48 /* detailEnd */}, }, }, }, &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 59 /* _diceExprX */}, + expr: &ruleIRefExpr{index: 60 /* _diceExprX */}, }, }, }, @@ -2011,13 +2058,13 @@ var g = &grammar{ exprs: []any{ &andCodeExpr{run: (*parser).call_onexprDice_49}, &andExpr{ - expr: &ruleIRefExpr{index: 63 /* _cocDiceType */}, + expr: &ruleIRefExpr{index: 64 /* _cocDiceType */}, }, &ruleIRefExpr{index: 47 /* detailStart */}, &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 64 /* _diceCocBonus */}, - &ruleIRefExpr{index: 65 /* _diceCocPenalty */}, + &ruleIRefExpr{index: 65 /* _diceCocBonus */}, + &ruleIRefExpr{index: 66 /* _diceCocPenalty */}, }, }, }, @@ -2030,7 +2077,7 @@ var g = &grammar{ exprs: []any{ &andCodeExpr{run: (*parser).call_onexprDice_59}, &andExpr{ - expr: &ruleIRefExpr{index: 61 /* _wodDiceType */}, + expr: &ruleIRefExpr{index: 62 /* _wodDiceType */}, }, &ruleIRefExpr{index: 47 /* detailStart */}, }, @@ -2048,14 +2095,14 @@ var g = &grammar{ run: (*parser).call_onexprDice_67, expr: &ruleIRefExpr{index: 46 /* nos */}, }, - &ruleIRefExpr{index: 62 /* _wodMain */}, + &ruleIRefExpr{index: 63 /* _wodMain */}, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 62 /* _wodMain */}, + &ruleIRefExpr{index: 63 /* _wodMain */}, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, @@ -2075,7 +2122,7 @@ var g = &grammar{ exprs: []any{ &andCodeExpr{run: (*parser).call_onexprDice_78}, &andExpr{ - expr: &ruleIRefExpr{index: 66 /* _dcDiceType */}, + expr: &ruleIRefExpr{index: 67 /* _dcDiceType */}, }, &ruleIRefExpr{index: 47 /* detailStart */}, }, @@ -2120,7 +2167,7 @@ var g = &grammar{ exprs: []any{ &andCodeExpr{run: (*parser).call_onexprDice_96}, &andExpr{ - expr: &ruleIRefExpr{index: 67 /* _fateDiceType */}, + expr: &ruleIRefExpr{index: 68 /* _fateDiceType */}, }, &ruleIRefExpr{index: 47 /* detailStart */}, &charClassMatcher{ @@ -2128,13 +2175,13 @@ var g = &grammar{ chars: []rune{'f', 'F'}, }, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, &ruleIRefExpr{index: 48 /* detailEnd */}, }, }, }, - &ruleIRefExpr{index: 79 /* value */}, + &ruleIRefExpr{index: 80 /* value */}, }, }, }, @@ -2152,7 +2199,7 @@ var g = &grammar{ alternatives: []any{ &actionExpr{ run: (*parser).call_onarray_call_6, - expr: &ruleIRefExpr{index: 80 /* number */}, + expr: &ruleIRefExpr{index: 81 /* number */}, }, &codeExpr{ run: (*parser).call_onarray_call_8, @@ -2171,7 +2218,7 @@ var g = &grammar{ alternatives: []any{ &actionExpr{ run: (*parser).call_onarray_call_13, - expr: &ruleIRefExpr{index: 80 /* number */}, + expr: &ruleIRefExpr{index: 81 /* number */}, }, &codeExpr{ run: (*parser).call_onarray_call_15, @@ -2186,11 +2233,11 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2208,11 +2255,11 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, ¬Expr{ expr: &litMatcher{val: "=", want: "\"=\""}, }, @@ -2220,7 +2267,7 @@ var g = &grammar{ }, }, &zeroOrOneExpr{ - expr: &ruleIRefExpr{index: 74 /* func_invoke */}, + expr: &ruleIRefExpr{index: 75 /* func_invoke */}, }, }, }, @@ -2232,9 +2279,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &andLogicalExpr{ - expr: &ruleIRefExpr{index: 70 /* item_getX */}, + expr: &ruleIRefExpr{index: 71 /* item_getX */}, }, - &ruleIRefExpr{index: 70 /* item_getX */}, + &ruleIRefExpr{index: 71 /* item_getX */}, }, }, }, @@ -2250,17 +2297,17 @@ var g = &grammar{ run: (*parser).call_onattr_getX_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, &zeroOrOneExpr{ - expr: &ruleIRefExpr{index: 74 /* func_invoke */}, + expr: &ruleIRefExpr{index: 75 /* func_invoke */}, }, }, }, @@ -2272,9 +2319,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &andLogicalExpr{ - expr: &ruleIRefExpr{index: 72 /* attr_getX */}, + expr: &ruleIRefExpr{index: 73 /* attr_getX */}, }, - &ruleIRefExpr{index: 72 /* attr_getX */}, + &ruleIRefExpr{index: 73 /* attr_getX */}, }, }, }, @@ -2288,7 +2335,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: ")", want: "\")\""}, }, }, @@ -2300,7 +2347,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2309,20 +2356,20 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &zeroOrMoreExpr{ expr: &actionExpr{ run: (*parser).call_onfunc_invoke_17, expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: ")", want: "\")\""}, }, }, @@ -2342,17 +2389,17 @@ var g = &grammar{ exprs: []any{ &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 76 /* value_id_without_colon */}, + &ruleIRefExpr{index: 77 /* value_id_without_colon */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: ":", want: "\":\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2368,19 +2415,19 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifierWithoutColon */}, + expr: &ruleIRefExpr{index: 99 /* identifierWithoutColon */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, &seqExpr{ exprs: []any{ &zeroOrOneExpr{ - expr: &ruleIRefExpr{index: 74 /* func_invoke */}, + expr: &ruleIRefExpr{index: 75 /* func_invoke */}, }, - &ruleIRefExpr{index: 71 /* item_get */}, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 72 /* item_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, }, @@ -2393,13 +2440,13 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, &litMatcher{val: "..", want: "\"..\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2413,7 +2460,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2428,14 +2475,14 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, }, }, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2452,7 +2499,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "true", want: "\"true\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2461,7 +2508,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "false", want: "\"false\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2470,7 +2517,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "null", want: "\"null\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2481,14 +2528,14 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "this", want: "\"this\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 71 /* item_get */}, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 72 /* item_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, }, @@ -2502,17 +2549,17 @@ var g = &grammar{ &litMatcher{val: "&", want: "\"&\""}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, - &ruleIRefExpr{index: 81 /* float */}, - &ruleIRefExpr{index: 80 /* number */}, + &ruleIRefExpr{index: 82 /* float */}, + &ruleIRefExpr{index: 81 /* number */}, &seqExpr{ exprs: []any{ &actionExpr{ @@ -2522,38 +2569,38 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 97 /* identifier */}, - &ruleIRefExpr{index: 125 /* spNoCR */}, + &ruleIRefExpr{index: 98 /* identifier */}, + &ruleIRefExpr{index: 126 /* spNoCR */}, }, }, }, &ruleIRefExpr{index: 47 /* detailStart */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 97 /* identifier */}, + expr: &ruleIRefExpr{index: 98 /* identifier */}, }, &ruleIRefExpr{index: 48 /* detailEnd */}, - &ruleIRefExpr{index: 125 /* spNoCR */}, + &ruleIRefExpr{index: 126 /* spNoCR */}, }, }, }, &seqExpr{ exprs: []any{ &zeroOrOneExpr{ - expr: &ruleIRefExpr{index: 74 /* func_invoke */}, + expr: &ruleIRefExpr{index: 75 /* func_invoke */}, }, - &ruleIRefExpr{index: 71 /* item_get */}, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 72 /* item_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, }, }, - &ruleIRefExpr{index: 94 /* fstring */}, + &ruleIRefExpr{index: 95 /* fstring */}, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 101 /* sub */}, - &ruleIRefExpr{index: 71 /* item_get */}, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 102 /* sub */}, + &ruleIRefExpr{index: 72 /* item_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, &seqExpr{ @@ -2563,18 +2610,18 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, &seqExpr{ exprs: []any{ &zeroOrOneExpr{ - expr: &ruleIRefExpr{index: 69 /* array_call */}, + expr: &ruleIRefExpr{index: 70 /* array_call */}, }, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, }, @@ -2582,25 +2629,25 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &andExpr{ - expr: &ruleIRefExpr{index: 77 /* value_array_range */}, + expr: &ruleIRefExpr{index: 78 /* value_array_range */}, }, - &ruleIRefExpr{index: 77 /* value_array_range */}, + &ruleIRefExpr{index: 78 /* value_array_range */}, &zeroOrOneExpr{ - expr: &ruleIRefExpr{index: 69 /* array_call */}, + expr: &ruleIRefExpr{index: 70 /* array_call */}, }, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, &seqExpr{ exprs: []any{ &andExpr{ - expr: &ruleIRefExpr{index: 78 /* value_array */}, + expr: &ruleIRefExpr{index: 79 /* value_array */}, }, - &ruleIRefExpr{index: 78 /* value_array */}, + &ruleIRefExpr{index: 79 /* value_array */}, &zeroOrOneExpr{ - expr: &ruleIRefExpr{index: 69 /* array_call */}, + expr: &ruleIRefExpr{index: 70 /* array_call */}, }, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, &seqExpr{ @@ -2610,16 +2657,16 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "}", want: "\"}\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 71 /* item_get */}, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 72 /* item_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, }, @@ -2631,7 +2678,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -2639,13 +2686,13 @@ var g = &grammar{ run: (*parser).call_onvalue_94, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 75 /* dict_item */}, + &ruleIRefExpr{index: 76 /* dict_item */}, &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 75 /* dict_item */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 76 /* dict_item */}, }, }, }, @@ -2653,14 +2700,14 @@ var g = &grammar{ expr: &litMatcher{val: ",", want: "\",\""}, }, &litMatcher{val: "}", want: "\"}\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 71 /* item_get */}, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 72 /* item_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, }, @@ -2713,8 +2760,8 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 90 /* strEscape */}, - &ruleIRefExpr{index: 83 /* strPart1Normal */}, + &ruleIRefExpr{index: 91 /* strEscape */}, + &ruleIRefExpr{index: 84 /* strPart1Normal */}, }, }, }, @@ -2751,8 +2798,8 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 90 /* strEscape */}, - &ruleIRefExpr{index: 85 /* strPart2Normal */}, + &ruleIRefExpr{index: 91 /* strEscape */}, + &ruleIRefExpr{index: 86 /* strPart2Normal */}, }, }, }, @@ -2789,8 +2836,8 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 90 /* strEscape */}, - &ruleIRefExpr{index: 87 /* strPart3Normal */}, + &ruleIRefExpr{index: 91 /* strEscape */}, + &ruleIRefExpr{index: 88 /* strPart3Normal */}, }, }, }, @@ -2827,8 +2874,8 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 90 /* strEscape */}, - &ruleIRefExpr{index: 89 /* strPart4Normal */}, + &ruleIRefExpr{index: 91 /* strEscape */}, + &ruleIRefExpr{index: 90 /* strPart4Normal */}, }, }, }, @@ -2919,9 +2966,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 91 /* fstringExpr1 */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 92 /* fstringExpr1 */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: "}", want: "\"}\""}, @@ -2936,7 +2983,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "{%", want: "\"{%\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &seqExpr{ @@ -2953,7 +3000,7 @@ var g = &grammar{ &andCodeExpr{run: (*parser).call_onfstringStmt_9}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "%}", want: "\"%}\""}, }, }, @@ -3011,7 +3058,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 82 /* strPart1 */}, + expr: &ruleIRefExpr{index: 83 /* strPart1 */}, }, &litMatcher{val: "'", want: "\"'\""}, }, @@ -3030,7 +3077,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 84 /* strPart2 */}, + expr: &ruleIRefExpr{index: 85 /* strPart2 */}, }, &litMatcher{val: "\"", want: "\"\\\"\""}, }, @@ -3051,9 +3098,9 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 86 /* strPart3 */}, - &ruleIRefExpr{index: 93 /* fstringStmt */}, - &ruleIRefExpr{index: 92 /* fstringExpr */}, + &ruleIRefExpr{index: 87 /* strPart3 */}, + &ruleIRefExpr{index: 94 /* fstringStmt */}, + &ruleIRefExpr{index: 93 /* fstringExpr */}, }, }, }, @@ -3076,9 +3123,9 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 88 /* strPart4 */}, - &ruleIRefExpr{index: 93 /* fstringStmt */}, - &ruleIRefExpr{index: 92 /* fstringExpr */}, + &ruleIRefExpr{index: 89 /* strPart4 */}, + &ruleIRefExpr{index: 94 /* fstringStmt */}, + &ruleIRefExpr{index: 93 /* fstringExpr */}, }, }, }, @@ -3090,7 +3137,7 @@ var g = &grammar{ }, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3114,9 +3161,9 @@ var g = &grammar{ expr: ¬Expr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 95 /* keywords */}, + &ruleIRefExpr{index: 96 /* keywords */}, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, &andCodeExpr{run: (*parser).call_onkeywords_test_6}, }, @@ -3129,12 +3176,12 @@ var g = &grammar{ run: (*parser).call_onidentifier_1, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 96 /* keywords_test */}, - &ruleIRefExpr{index: 99 /* xidStart */}, + &ruleIRefExpr{index: 97 /* keywords_test */}, + &ruleIRefExpr{index: 100 /* xidStart */}, &zeroOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 100 /* xidContinue */}, + &ruleIRefExpr{index: 101 /* xidContinue */}, &litMatcher{val: ":", want: "\":\""}, }, }, @@ -3149,10 +3196,10 @@ var g = &grammar{ run: (*parser).call_onidentifierWithoutColon_1, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 96 /* keywords_test */}, - &ruleIRefExpr{index: 99 /* xidStart */}, + &ruleIRefExpr{index: 97 /* keywords_test */}, + &ruleIRefExpr{index: 100 /* xidStart */}, &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 100 /* xidContinue */}, + expr: &ruleIRefExpr{index: 101 /* xidContinue */}, }, }, }, @@ -3178,9 +3225,9 @@ var g = &grammar{ name: "sub", expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 103 /* parenOpen */}, + &ruleIRefExpr{index: 104 /* parenOpen */}, &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 104 /* parenClose */}, + &ruleIRefExpr{index: 105 /* parenClose */}, }, }, }, @@ -3188,9 +3235,9 @@ var g = &grammar{ name: "subX", expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 101 /* sub */}, - &ruleIRefExpr{index: 71 /* item_get */}, - &ruleIRefExpr{index: 73 /* attr_get */}, + &ruleIRefExpr{index: 102 /* sub */}, + &ruleIRefExpr{index: 72 /* item_get */}, + &ruleIRefExpr{index: 74 /* attr_get */}, }, }, }, @@ -3199,7 +3246,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3208,7 +3255,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ")", want: "\")\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3222,7 +3269,7 @@ var g = &grammar{ &litMatcher{val: "+", want: "\"+\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3236,7 +3283,7 @@ var g = &grammar{ &litMatcher{val: "-", want: "\"-\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3250,7 +3297,7 @@ var g = &grammar{ &litMatcher{val: "*", want: "\"*\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3264,7 +3311,7 @@ var g = &grammar{ &litMatcher{val: "/", want: "\"/\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3273,7 +3320,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "%", want: "\"%\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3284,13 +3331,13 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &litMatcher{val: "^", want: "\"^\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, &seqExpr{ exprs: []any{ &litMatcher{val: "**", want: "\"**\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3301,7 +3348,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "??", want: "\"??\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3310,7 +3357,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "|", want: "\"|\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3319,7 +3366,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3328,7 +3375,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "||", want: "\"||\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3337,7 +3384,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&&", want: "\"&&\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3346,7 +3393,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "<", want: "\"<\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3355,7 +3402,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ">", want: "\">\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3364,7 +3411,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "<=", want: "\"<=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3373,7 +3420,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ">=", want: "\">=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3382,7 +3429,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "==", want: "\"==\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3391,7 +3438,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "!=", want: "\"!=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3416,7 +3463,7 @@ var g = &grammar{ val: "[ \\n\\t\\r]", chars: []rune{' ', '\n', '\t', '\r'}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, ¬Expr{ @@ -3429,8 +3476,8 @@ var g = &grammar{ name: "sp1x", expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp1 */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 124 /* sp1 */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3447,9 +3494,9 @@ var g = &grammar{ name: "comment", expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 125 /* spNoCR */}, + &ruleIRefExpr{index: 126 /* spNoCR */}, &litMatcher{val: "//", want: "\"//\""}, - &ruleIRefExpr{index: 127 /* commentLineRest */}, + &ruleIRefExpr{index: 128 /* commentLineRest */}, }, }, }, @@ -3512,8 +3559,8 @@ var g = &grammar{ name: "st_expr", expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 134 /* st_modify_multi_1 */}, - &ruleIRefExpr{index: 131 /* st_assign_multi */}, + &ruleIRefExpr{index: 135 /* st_modify_multi_1 */}, + &ruleIRefExpr{index: 132 /* st_assign_multi */}, }, }, }, @@ -3551,12 +3598,12 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 133 /* st_assign */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 134 /* st_assign */}, + &ruleIRefExpr{index: 123 /* sp */}, &zeroOrOneExpr{ expr: &litMatcher{val: ",", want: "\",\""}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3566,12 +3613,12 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "*", want: "\"*\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 81 /* float */}, - &ruleIRefExpr{index: 80 /* number */}, - &ruleIRefExpr{index: 101 /* sub */}, + &ruleIRefExpr{index: 82 /* float */}, + &ruleIRefExpr{index: 81 /* number */}, + &ruleIRefExpr{index: 102 /* sub */}, }, }, }, @@ -3589,29 +3636,29 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 141 /* st_name2 */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 142 /* st_name2 */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, - &ruleIRefExpr{index: 141 /* st_name2 */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 142 /* st_name2 */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, @@ -3622,13 +3669,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 139 /* st_name1 */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 140 /* st_name1 */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, - &ruleIRefExpr{index: 139 /* st_name1 */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 140 /* st_name1 */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, @@ -3639,33 +3686,33 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 132 /* st_star */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 133 /* st_star */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 132 /* st_star */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 133 /* st_star */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, @@ -3676,33 +3723,33 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "*", want: "\"*\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 123 /* sp */}, &litMatcher{val: "*", want: "\"*\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, @@ -3713,29 +3760,29 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, @@ -3746,13 +3793,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 140 /* st_name1r */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 141 /* st_name1r */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, - &ruleIRefExpr{index: 140 /* st_name1r */}, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 141 /* st_name1r */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, @@ -3766,28 +3813,28 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 141 /* st_name2 */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 142 /* st_name2 */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 141 /* st_name2 */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 142 /* st_name2 */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3795,7 +3842,7 @@ var g = &grammar{ run: (*parser).call_onst_assign_117, expr: &labeledExpr{ label: "text", - expr: &ruleIRefExpr{index: 130 /* est */}, + expr: &ruleIRefExpr{index: 131 /* est */}, textCapture: true, }, }, @@ -3811,28 +3858,28 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 130 /* est */}, + &ruleIRefExpr{index: 131 /* est */}, }, }, }, &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3840,7 +3887,7 @@ var g = &grammar{ run: (*parser).call_onst_assign_139, expr: &labeledExpr{ label: "text", - expr: &ruleIRefExpr{index: 130 /* est */}, + expr: &ruleIRefExpr{index: 131 /* est */}, textCapture: true, }, }, @@ -3855,15 +3902,15 @@ var g = &grammar{ exprs: []any{ &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 135 /* st_modify_lead */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 136 /* st_modify_lead */}, + &ruleIRefExpr{index: 123 /* sp */}, &zeroOrOneExpr{ expr: &litMatcher{val: ",", want: "\",\""}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, - &ruleIRefExpr{index: 136 /* st_modify_multi_rest */}, + &ruleIRefExpr{index: 137 /* st_modify_multi_rest */}, }, }, }, @@ -3876,13 +3923,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 141 /* st_name2 */}, - &ruleIRefExpr{index: 137 /* st_modify_rest1 */}, + &ruleIRefExpr{index: 142 /* st_name2 */}, + &ruleIRefExpr{index: 138 /* st_modify_rest1 */}, }, }, }, - &ruleIRefExpr{index: 141 /* st_name2 */}, - &ruleIRefExpr{index: 137 /* st_modify_rest1 */}, + &ruleIRefExpr{index: 142 /* st_name2 */}, + &ruleIRefExpr{index: 138 /* st_modify_rest1 */}, }, }, &seqExpr{ @@ -3890,13 +3937,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 137 /* st_modify_rest1 */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 138 /* st_modify_rest1 */}, }, }, }, - &ruleIRefExpr{index: 142 /* st_name2r */}, - &ruleIRefExpr{index: 137 /* st_modify_rest1 */}, + &ruleIRefExpr{index: 143 /* st_name2r */}, + &ruleIRefExpr{index: 138 /* st_modify_rest1 */}, }, }, &seqExpr{ @@ -3904,13 +3951,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 139 /* st_name1 */}, - &ruleIRefExpr{index: 138 /* st_modify_rest */}, + &ruleIRefExpr{index: 140 /* st_name1 */}, + &ruleIRefExpr{index: 139 /* st_modify_rest */}, }, }, }, - &ruleIRefExpr{index: 139 /* st_name1 */}, - &ruleIRefExpr{index: 138 /* st_modify_rest */}, + &ruleIRefExpr{index: 140 /* st_name1 */}, + &ruleIRefExpr{index: 139 /* st_modify_rest */}, }, }, &seqExpr{ @@ -3918,13 +3965,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 140 /* st_name1r */}, - &ruleIRefExpr{index: 138 /* st_modify_rest */}, + &ruleIRefExpr{index: 141 /* st_name1r */}, + &ruleIRefExpr{index: 139 /* st_modify_rest */}, }, }, }, - &ruleIRefExpr{index: 140 /* st_name1r */}, - &ruleIRefExpr{index: 138 /* st_modify_rest */}, + &ruleIRefExpr{index: 141 /* st_name1r */}, + &ruleIRefExpr{index: 139 /* st_modify_rest */}, }, }, }, @@ -3935,12 +3982,12 @@ var g = &grammar{ expr: &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 135 /* st_modify_lead */}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 136 /* st_modify_lead */}, + &ruleIRefExpr{index: 123 /* sp */}, &zeroOrOneExpr{ expr: &litMatcher{val: ",", want: "\",\""}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, }, }, }, @@ -3950,7 +3997,7 @@ var g = &grammar{ varExists: true, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ @@ -3958,7 +4005,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "+=", want: "\"+=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -3972,7 +4019,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "-=", want: "\"-=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -3991,7 +4038,7 @@ var g = &grammar{ varExists: true, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ @@ -4002,7 +4049,7 @@ var g = &grammar{ &zeroOrOneExpr{ expr: &litMatcher{val: "=", want: "\"=\""}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -4016,7 +4063,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "-=", want: "\"-=\""}, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -4032,7 +4079,7 @@ var g = &grammar{ &andExpr{ expr: &litMatcher{val: "-", want: "\"-\""}, }, - &ruleIRefExpr{index: 122 /* sp */}, + &ruleIRefExpr{index: 123 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -4056,11 +4103,11 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &oneOrMoreExpr{ - expr: &ruleIRefExpr{index: 143 /* id_ch */}, + expr: &ruleIRefExpr{index: 144 /* id_ch */}, }, &litMatcher{val: ":", want: "\":\""}, &oneOrMoreExpr{ - expr: &ruleIRefExpr{index: 143 /* id_ch */}, + expr: &ruleIRefExpr{index: 144 /* id_ch */}, }, }, }, @@ -4078,7 +4125,7 @@ var g = &grammar{ expr: &labeledExpr{ label: "text", expr: &oneOrMoreExpr{ - expr: &ruleIRefExpr{index: 143 /* id_ch */}, + expr: &ruleIRefExpr{index: 144 /* id_ch */}, }, textCapture: true, }, @@ -4093,7 +4140,7 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 143 /* id_ch */}, + &ruleIRefExpr{index: 144 /* id_ch */}, &charClassMatcher{ val: "[0-9]", ranges: []rune{'0', '9'}, @@ -4114,7 +4161,7 @@ var g = &grammar{ }, { name: "st_name2", - expr: &ruleIRefExpr{index: 139 /* st_name1 */}, + expr: &ruleIRefExpr{index: 140 /* st_name1 */}, }, { name: "st_name2r", @@ -4126,7 +4173,7 @@ var g = &grammar{ expr: &labeledExpr{ label: "text", expr: &oneOrMoreExpr{ - expr: &ruleIRefExpr{index: 143 /* id_ch */}, + expr: &ruleIRefExpr{index: 144 /* id_ch */}, }, textCapture: true, }, @@ -4141,7 +4188,7 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 143 /* id_ch */}, + &ruleIRefExpr{index: 144 /* id_ch */}, &charClassMatcher{ val: "[0-9]", ranges: []rune{'0', '9'}, @@ -4162,7 +4209,7 @@ var g = &grammar{ }, { name: "id_ch", - expr: &ruleIRefExpr{index: 99 /* xidStart */}, + expr: &ruleIRefExpr{index: 100 /* xidStart */}, }, }, } @@ -4846,7 +4893,7 @@ func (p *parser) call_on_dicePearMod_2() any { })(&p.cur) } -func (p *parser) call_on_dicePearMod_4() any { +func (p *parser) call_on_dicePearMod_6() any { return (func(c *current) any { c.data.PushIntNumber("2") c.data.AddOp(typeDiceSetTimes) @@ -4879,6 +4926,14 @@ func (p *parser) call_on_diceExpr3_2() any { })(&p.cur) } +func (p *parser) call_on_diceExpr4_2() any { + return (func(c *current) any { + c.data.AddOp(typeDiceInit) + c.data.AddOp(typeDiceSetTimes) + return nil + })(&p.cur) +} + func (p *parser) call_on_diceExprX_1() any { return (func(c *current) any { c.data.AddOp(typeDice) @@ -6199,19 +6254,18 @@ func (p *parser) addErrAt(err error, pos position, expected []string) { if buf.Len() > 0 { buf.WriteString(":") } - buf.WriteString(fmt.Sprintf("%d:%d", pos.line, pos.col)) + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) if len(p.rstack) > 0 { if buf.Len() > 0 { - buf.WriteString(" ") + buf.WriteString(": ") } rule := p.rstack[len(p.rstack)-1] if rule.displayName != "" { - buf.WriteString(rule.displayName[1:len(rule.displayName)-1]) + buf.WriteString("rule " + rule.displayName) } else { - buf.WriteString(rule.name) + buf.WriteString("rule " + rule.name) } } - // x(p.filename, pos.line, pos.col, pos.offset, ruleName) pe := &parserError{Inner: err, pos: pos, prefix: buf.String(), expected: expected} p.errs.add(pe) } diff --git a/roll_func.go b/roll_func.go index db81b0c8..d2700b5c 100644 --- a/roll_func.go +++ b/roll_func.go @@ -20,10 +20,16 @@ func getSource() *rand.PCGSource { var randSource = getSource() -func Roll(src *rand.PCGSource, dicePoints IntType) IntType { +func Roll(src *rand.PCGSource, dicePoints IntType, mod int) IntType { if dicePoints == 0 { return 0 } + if mod == -1 { + return 1 + } + if mod == 1 { + return dicePoints + } if src == nil { src = randSource } @@ -63,7 +69,7 @@ func wodCheck(e *Context, addLine IntType, pool IntType, points IntType, thresho } // RollWoD 返回: 成功数,总骰数,轮数,细节 -func RollWoD(src *rand.PCGSource, addLine IntType, pool IntType, points IntType, threshold IntType, isGE bool) (IntType, IntType, IntType, string) { +func RollWoD(src *rand.PCGSource, addLine IntType, pool IntType, points IntType, threshold IntType, isGE bool, mode int) (IntType, IntType, IntType, string) { var details []string addTimes := 1 @@ -78,7 +84,7 @@ func RollWoD(src *rand.PCGSource, addLine IntType, pool IntType, points IntType, for i := IntType(0); i < pool; i++ { var reachSuccess bool var reachAddRound bool - one := Roll(src, points) + one := Roll(src, points, mode) if addLine != 0 { reachAddRound = one >= addLine @@ -162,7 +168,7 @@ func doubleCrossCheck(ctx *Context, addLine, pool, points IntType) bool { return true } -func RollDoubleCross(src *rand.PCGSource, addLine IntType, pool IntType, points IntType) (IntType, IntType, IntType, string) { +func RollDoubleCross(src *rand.PCGSource, addLine IntType, pool IntType, points IntType, mode int) (IntType, IntType, IntType, string) { var details []string addTimes := 1 @@ -176,7 +182,7 @@ func RollDoubleCross(src *rand.PCGSource, addLine IntType, pool IntType, points maxDice := IntType(0) for i := IntType(0); i < pool; i++ { - one := Roll(src, points) + one := Roll(src, points, mode) if one > maxDice { maxDice = one } @@ -239,10 +245,10 @@ func RollDoubleCross(src *rand.PCGSource, addLine IntType, pool IntType, points } // RollCommon (times)d(dicePoints)kl(lowNum) 或 (times)d(dicePoints)kh(highNum) -func RollCommon(src *rand.PCGSource, times, dicePoints IntType, diceMin, diceMax *IntType, isKeepLH, lowNum, highNum IntType) (IntType, string) { +func RollCommon(src *rand.PCGSource, times, dicePoints IntType, diceMin, diceMax *IntType, isKeepLH, lowNum, highNum IntType, mode int) (IntType, string) { var nums []IntType for i := IntType(0); i < times; i += 1 { - die := Roll(src, dicePoints) + die := Roll(src, dicePoints, mode) if diceMax != nil { if die > *diceMax { die = *diceMax @@ -324,8 +330,8 @@ func RollCommon(src *rand.PCGSource, times, dicePoints IntType, diceMin, diceMax return num, text } -func RollCoC(src *rand.PCGSource, isBonus bool, diceNum IntType) (IntType, string) { - diceResult := Roll(src, 100) +func RollCoC(src *rand.PCGSource, isBonus bool, diceNum IntType, mode int) (IntType, string) { + diceResult := Roll(src, 100, mode) diceTens := diceResult / 10 diceUnits := diceResult % 10 @@ -335,7 +341,7 @@ func RollCoC(src *rand.PCGSource, isBonus bool, diceNum IntType) (IntType, strin num10Exists := false for i := IntType(0); i < diceNum; i++ { - n := Roll(src, 10) + n := Roll(src, 10, mode) if n == 10 { num10Exists = true @@ -374,11 +380,11 @@ func RollCoC(src *rand.PCGSource, isBonus bool, diceNum IntType) (IntType, strin } } -func RollFate(src *rand.PCGSource) (IntType, string) { +func RollFate(src *rand.PCGSource, mode int) (IntType, string) { detail := "" sum := IntType(0) for i := 0; i < 4; i++ { - n := Roll(src, 3) - 2 + n := Roll(src, 3, mode) - 2 sum += n switch n { case -1: diff --git a/roll_func_test.go b/roll_func_test.go index c3df5591..9ab26ccc 100644 --- a/roll_func_test.go +++ b/roll_func_test.go @@ -6,16 +6,26 @@ import ( ) func TestRollCommon(t *testing.T) { - ret, _ := RollCommon(nil, 5, 1, nil, nil, 0, 0, 0) + ret, _ := RollCommon(nil, 5, 1, nil, nil, 0, 0, 0, 0) + assert.Equal(t, ret, IntType(5)) +} + +func TestRollCommonMax(t *testing.T) { + ret, _ := RollCommon(nil, 5, 10, nil, nil, 0, 0, 0, 1) + assert.Equal(t, ret, IntType(50)) +} + +func TestRollCommonMin(t *testing.T) { + ret, _ := RollCommon(nil, 5, 10, nil, nil, 0, 0, 0, -1) assert.Equal(t, ret, IntType(5)) } func TestRollDoubleCross(t *testing.T) { - ret, _, _, _ := RollDoubleCross(nil, 11, 10, 10) // pool默认为10,10c11 = 10c11m10 + ret, _, _, _ := RollDoubleCross(nil, 11, 10, 10, 0) // pool默认为10,10c11 = 10c11m10 assert.True(t, ret <= 10) } func TestRollWoD(t *testing.T) { - ret, _, _, _ := RollWoD(nil, 11, 8, 10, 1, true) // 8a11m10k1 + ret, _, _, _ := RollWoD(nil, 11, 8, 10, 1, true, 0) // 8a11m10k1 assert.Equal(t, IntType(8), ret) } diff --git a/rollvm.go b/rollvm.go index dba7da65..6d85eec0 100644 --- a/rollvm.go +++ b/rollvm.go @@ -20,6 +20,7 @@ import ( "bytes" "errors" "fmt" + "regexp" "sort" "strconv" "strings" @@ -200,7 +201,8 @@ func (ctx *Context) makeDetailStr(details []BufferSpan) string { if ctx.Config.CustomMakeDetailFunc != nil { return ctx.Config.CustomMakeDetailFunc(ctx, details, ctx.parser.data) } - detailResult := ctx.parser.data + offset := ctx.parser.pt.offset + detailResult := ctx.parser.data[:offset] curPoint := IntType(-1) // nolint lastEnd := IntType(-1) // nolint @@ -255,7 +257,11 @@ func (ctx *Context) makeDetailStr(details []BufferSpan) string { } } - exprText := string(detailResult[item.begin:item.end]) + exprText := last.Expr + if last.Expr == "" { + exprText = string(detailResult[item.begin:item.end]) + } + writeBuf(detailResult[:item.begin]) // 主体结果部分,如 (10d3)d5=63[(10d3)d5=2+2+2+5+2+5+5+4+1+3+4+1+4+5+4+3+4+5+2,10d3=19] @@ -310,7 +316,7 @@ func (ctx *Context) evaluate() { diceStateIndex := -1 var diceStates []struct { times IntType // 次数,如 2d10,times为2 - isKeepLH IntType // 为1对应取低个数,为2对应取高个数,3为丢弃低个数,4为丢弃高个数 + isKeepLH IntType // 为1对应取低个数kl,为2对应取高个数kh,3为丢弃低个数dl,4为丢弃高个数dh lowNum IntType highNum IntType min *IntType @@ -403,6 +409,16 @@ func (ctx *Context) evaluate() { e.top += 1 } + getRollMode := func() int { + if ctx.Config.DiceMinMode { + return -1 + } + if ctx.Config.DiceMaxMode { + return 1 + } + return 0 + } + var fstrBlockStack [5]int var fstrBlockIndex int @@ -537,6 +553,35 @@ func (ctx *Context) evaluate() { stackPush(NewIntVal(100)) } + d := &details[len(details)-1] + dText := string(ctx.parser.data[d.Begin:d.End]) + + if !regexp.MustCompile("[dD][优優劣][势勢]").MatchString(dText) { + s := &diceStates[diceStateIndex] + if s.times > 1 { + d.Expr = fmt.Sprintf("%dD%s", s.times, stack[e.top-1].ToString()) + } else { + d.Expr = fmt.Sprintf("D%s", stack[e.top-1].ToString()) + } + + switch s.isKeepLH { + case 1: + d.Expr += fmt.Sprintf("kl%d", s.lowNum) + case 2: + d.Expr += fmt.Sprintf("kh%d", s.highNum) + case 3: + d.Expr += fmt.Sprintf("dl%d", s.lowNum) + case 4: + d.Expr += fmt.Sprintf("dh%d", s.highNum) + } + if s.min != nil { + d.Expr += fmt.Sprintf("min%d", *s.min) + } + if s.max != nil { + d.Expr += fmt.Sprintf("max%d", *s.max) + } + } + case typeLogicAnd: a, b := stackPop2() if !a.AsBool() { @@ -815,7 +860,7 @@ func (ctx *Context) evaluate() { return } - num, detail := RollCommon(ctx.randSrc, diceState.times, bInt, diceState.min, diceState.max, diceState.isKeepLH, diceState.lowNum, diceState.highNum) + num, detail := RollCommon(ctx.randSrc, diceState.times, bInt, diceState.min, diceState.max, diceState.isKeepLH, diceState.lowNum, diceState.highNum, getRollMode()) diceStateIndex -= 1 ret := NewIntVal(num) @@ -825,7 +870,7 @@ func (ctx *Context) evaluate() { stackPush(ret) case typeDiceFate: - sum, detail := RollFate(ctx.randSrc) + sum, detail := RollFate(ctx.randSrc, getRollMode()) ret := NewIntVal(sum) details[len(details)-1].Ret = ret details[len(details)-1].Text = detail @@ -841,7 +886,7 @@ func (ctx *Context) evaluate() { } isBonus := code.T == typeDiceCocBonus - r, detailText := RollCoC(ctx.randSrc, isBonus, diceNum) + r, detailText := RollCoC(ctx.randSrc, isBonus, diceNum, getRollMode()) ret := NewIntVal(r) details[len(details)-1].Ret = ret details[len(details)-1].Text = detailText @@ -880,7 +925,7 @@ func (ctx *Context) evaluate() { return } - num, _, _, detailText := RollWoD(ctx.randSrc, v.MustReadInt(), wodState.pool, wodState.points, wodState.threshold, wodState.isGE) + num, _, _, detailText := RollWoD(ctx.randSrc, v.MustReadInt(), wodState.pool, wodState.points, wodState.threshold, wodState.isGE, getRollMode()) ret := NewIntVal(num) details[len(details)-1].Ret = ret details[len(details)-1].Text = detailText @@ -901,7 +946,7 @@ func (ctx *Context) evaluate() { if !doubleCrossCheck(ctx, v.MustReadInt(), dcState.pool, dcState.points) { return } - success, _, _, detailText := RollDoubleCross(nil, v.MustReadInt(), dcState.pool, dcState.points) + success, _, _, detailText := RollDoubleCross(nil, v.MustReadInt(), dcState.pool, dcState.points, getRollMode()) ret := NewIntVal(success) details[len(details)-1].Ret = ret details[len(details)-1].Text = detailText diff --git a/rollvm_st_test.go b/rollvm_st_test.go index 7e9dad74..da1b1771 100644 --- a/rollvm_st_test.go +++ b/rollvm_st_test.go @@ -245,3 +245,21 @@ func TestStModMinus2(t *testing.T) { err := vm.Run(`^st力量-=3d1-1 `) assert.NoError(t, err) } + +func TestStModMinus3(t *testing.T) { + vm := NewVM() + + items := []checkItem{ + checkItem{Name: "hp", Value: ni(0), Type: "mod", Op: "-="}, + } + + index := 0 + vm.Config.CallbackSt = func(_type string, name string, val *VMValue, extra *VMValue, op string, detail string) { + // fmt.Println("!!", _type, name, val, extra, op, detail) + items[index].check(t, _type, name, val, extra, op, detail) + index += 1 + } + + err := vm.Run(`^sthp-=1-1 `) + assert.NoError(t, err) +} diff --git a/rollvm_test.go b/rollvm_test.go index dc891df2..d261a795 100644 --- a/rollvm_test.go +++ b/rollvm_test.go @@ -1780,3 +1780,39 @@ func TestDetailText3(t *testing.T) { assert.Equal(t, "2[(2d1)d1=1+1,2d1=2]", vm.GetDetailText()) } } + +func TestDetailText4(t *testing.T) { + vm := NewVM() + vm.Config.DiceMaxMode = true + err := vm.Run("d + 2d") + if assert.NoError(t, err) { + assert.Equal(t, "100[D100] + 200[2D100=100+100]", vm.GetDetailText()) + } +} + +func TestDetailText5(t *testing.T) { + vm := NewVM() + vm.Config.DiceMaxMode = true + err := vm.Run("2dk1") + if assert.NoError(t, err) { + assert.Equal(t, "100[2D100kh1={100 | 100}]", vm.GetDetailText()) + } +} + +func TestDiceAdvantage(t *testing.T) { + vm := NewVM() + vm.Config.DefaultDiceSideExpr = "1" + err := vm.Run("d优势") + if assert.NoError(t, err) { + assert.Equal(t, "1[d优势={1 | 1}]", vm.GetDetailText()) + } +} + +func TestDiceAdvantage2(t *testing.T) { + vm := NewVM() + vm.Config.DefaultDiceSideExpr = "1" + err := vm.Run("3d优势") + if assert.NoError(t, err) { + assert.Equal(t, "3[3D1=1+1+1]", vm.GetDetailText()) + } +} diff --git a/types.go b/types.go index 42b2e88d..823b8650 100644 --- a/types.go +++ b/types.go @@ -98,7 +98,6 @@ type RollConfig struct { EnableV1IfCompatible bool // 一种特殊的兼容,fstring中如果最后一个语句是if那么此项为空字符串 - // 以下尚未实现 DiceMinMode bool // 骰子以最小值结算,用于获取下界 DiceMaxMode bool // 以最大值结算 获取上界 }