diff --git a/README.md b/README.md index 5e6c9063..def2def6 100644 --- a/README.md +++ b/README.md @@ -82,10 +82,6 @@ https://sealdice.github.io/dicescript/ [更新记录](./docs/CHANGELOG.md) -## TODO - -* computed 的repr格式无法读入 - ## 开发 如果修改了文法,使用这个工具重新生成: diff --git a/builtin_functions.go b/builtin_functions.go index d52372f2..9275a8bd 100644 --- a/builtin_functions.go +++ b/builtin_functions.go @@ -152,6 +152,32 @@ func funcLoadRaw(ctx *Context, this *VMValue, params []*VMValue) *VMValue { return funcLoadBase(ctx, this, params, true) } +func funcLoadRawAttr(ctx *Context, this *VMValue, params []*VMValue) *VMValue { + obj := params[0] + attr := params[1] + if attr.TypeId != VMTypeString { + ctx.Error = errors.New("(loadRawAttr)类型错误: 参数2类型必须为str") + return nil + } + + ret := obj.attrGetRaw(ctx, attr.Value.(string), true) + if ctx.Error != nil { + return nil + } + return ret +} + +func funcLoadRawItem(ctx *Context, this *VMValue, params []*VMValue) *VMValue { + obj := params[0] + index := params[1] + + ret := obj.itemGetRaw(ctx, index) + if ctx.Error != nil { + return nil + } + return ret +} + func funcStore(ctx *Context, this *VMValue, params []*VMValue) *VMValue { name := params[0] if name.TypeId != VMTypeString { @@ -204,10 +230,12 @@ var builtinValues = map[string]*VMValue{ "toStr": nnf(&ndf{"toStr", []string{"value"}, nil, nil, funcToStr}), "toBool": nnf(&ndf{"toBool", []string{"value"}, nil, nil, funcToBool}), - "repr": nnf(&ndf{"repr", []string{"value"}, nil, nil, funcRepr}), - "load": nnf(&ndf{"load", []string{"value"}, nil, nil, nil}), - "loadRaw": nnf(&ndf{"loadRaw", []string{"value"}, nil, nil, nil}), - "store": nnf(&ndf{"store", []string{"name", "value"}, nil, nil, nil}), + "repr": nnf(&ndf{"repr", []string{"value"}, nil, nil, funcRepr}), + "load": nnf(&ndf{"load", []string{"value"}, nil, nil, nil}), + "loadRaw": nnf(&ndf{"loadRaw", []string{"value"}, nil, nil, nil}), + "loadRawAttr": nnf(&ndf{"loadRawAttr", []string{"obj", "name"}, nil, nil, nil}), + "loadRawItem": nnf(&ndf{"loadRawItem", []string{"obj", "index"}, nil, nil, nil}), + "store": nnf(&ndf{"store", []string{"name", "value"}, nil, nil, nil}), // TODO: roll() @@ -225,6 +253,12 @@ func _init() bool { nfd, _ = builtinValues["loadRaw"].ReadNativeFunctionData() nfd.NativeFunc = funcLoadRaw + nfd, _ = builtinValues["loadRawAttr"].ReadNativeFunctionData() + nfd.NativeFunc = funcLoadRawAttr + + nfd, _ = builtinValues["loadRawItem"].ReadNativeFunctionData() + nfd.NativeFunc = funcLoadRawItem + nfd, _ = builtinValues["store"].ReadNativeFunctionData() nfd.NativeFunc = funcStore return false diff --git a/builtin_functions_test.go b/builtin_functions_test.go index c615e6c2..e435ca2e 100644 --- a/builtin_functions_test.go +++ b/builtin_functions_test.go @@ -129,6 +129,43 @@ func TestNativeFunctionLoadRaw(t *testing.T) { assert.Error(t, err) } +func TestNativeFunctionLoadRawAttr(t *testing.T) { + vm := NewVM() + err := vm.Run("a = &(1+2); obj = {'a': &a, 'x': {'a': &a}}; typeId(loadRawAttr(obj, 'a'))") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(IntType(VMTypeComputedValue)))) + } + + vm = NewVM() + err = vm.Run("a = &(1+2); obj = {'a': &a, 'x': {'a': &a}}; repr(loadRawAttr(loadRawItem(obj, 'x'), 'a'))") + if assert.NoError(t, err) { + repr, ok := vm.Ret.ReadString() + if assert.True(t, ok) { + assert.Equal(t, "&(1+2)", repr) + } + } + + vm = NewVM() + err = vm.Run("a = &(1+2); obj = {'a': &a}; obj.a") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(3))) + } +} + +func TestNativeFunctionLoadRawItem(t *testing.T) { + vm := NewVM() + err := vm.Run("a = &(1+2); obj = {'a': &a}; typeId(loadRawItem(obj, 'a'))") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(IntType(VMTypeComputedValue)))) + } + + vm = NewVM() + err = vm.Run("a = &(1+2); arr = [&a]; typeId(loadRawItem(arr, 0))") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(IntType(VMTypeComputedValue)))) + } +} + func TestNativeFunctionAbs(t *testing.T) { vm := NewVM() assert.True(t, valueEqual(funcAbs(vm, nil, []*VMValue{ni(-5)}), ni(5))) diff --git a/cmd/main.go b/cmd/main.go index 9f28e290..f6c9edc8 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -51,23 +51,18 @@ func main() { vm.Config.HookValueLoadPre = func(ctx *ds.Context, name string) (string, *ds.VMValue) { re := regexp.MustCompile(`^(困难|极难|大成功|常规|失败|困難|極難|常規|失敗)?([^\d]+)(\d+)?$`) m := re.FindStringSubmatch(name) - var cocFlagVarPrefix string - if len(m) > 0 { if m[1] != "" { - cocFlagVarPrefix = m[1] name = name[len(m[1]):] } // 有末值时覆盖,有初值时 if m[3] != "" { v, _ := strconv.ParseInt(m[3], 10, 64) - fmt.Println("COC值:", name, cocFlagVarPrefix) return name, ds.NewIntVal(ds.IntType(v)) } } - fmt.Println("COC值:", name, cocFlagVarPrefix) return name, nil } diff --git a/docs/GUIDE.md b/docs/GUIDE.md index 01b7c6b5..1440f529 100644 --- a/docs/GUIDE.md +++ b/docs/GUIDE.md @@ -371,6 +371,36 @@ null代表空值。 &a.x = 5 ``` +也可以直接写 computed 字面量: + +``` +a = &(1d6 + 2) +repr(loadRaw('a')) // => &(1d6 + 2) +``` + +普通读取会自动执行 computed,不只变量名如此,成员读取现在也是一致的: + +``` +a = &(1d6 + 2) +obj = {'a': &a} +arr = [&a] + +a // 执行 computed +obj.a // 也会执行 computed +obj['a'] // 也会执行 computed +arr[0] // 也会执行 computed +``` + +如果你需要从字典、数组或对象里拿到“公式本体”,而不是计算结果,可以使用新的 raw 读取 API: + +``` +loadRawAttr(obj, 'a') // 读取 obj.a,但不自动执行 computed +loadRawItem(obj, 'a') // 读取 obj['a'],但不自动执行 computed +loadRawItem(arr, 0) // 读取 arr[0],但不自动执行 computed + +repr(loadRawAttr(obj, 'a')) // => &(1d6 + 2) +``` + 这里的this是指该变量内部的一个空间,如果你有其他编程语言经验,可以理解为函数的内部变量。 > this的解释请参考:https://www.runoob.com/js/js-this.html ,在DiceScript中this的用法基本与JS相同。 @@ -469,6 +499,24 @@ d['v4'] = 5 请特别注意,字典的键必须为字符串,实际操作中也允许数字类型,但是会自动转换为字符串。 +字典函数: +``` +d = {'v1': 1, 'v2': &(1d6 + 2)} + +d.len() // 键值对数量,2 +d.keys() // 所有键,如 ['v1', 'v2'] +d.values() // 所有值,如 [1, &(1d6 + 2)],其中 computed 会在后续使用时正常求值 +d.items() // 所有键值对,如 [['v1', 1], ['v2', &(1d6 + 2)]] +d.has('v1') // 是否存在该键,1 +d.has('v3') // 不存在时返回 0 +d.get('v1') // 读取键对应的值,1 +d.get('v3', 100) // 键不存在时返回默认值,100 +d.getRaw('v2') // 读取原始值,不自动执行 computed +repr(d.getRaw('v2')) // => &(1d6 + 2) +``` + +注意:这些方法只检查当前字典本身,不会沿 `__proto__` 继续查找。 + #### 函数 @@ -633,6 +681,9 @@ bool(obj) // 将对象二值化,结果为0或1 repr(obj) // 将对象转化为供解释器读取的形式,类似于python的同名函数 load(name) // 读取变量名为name的变量,拿到其值 loadRaw(name) // 读取变量名为name的变量,与load()不同,如果该变量是计算类型,那么不会返回计算后结果 + // 对 computed,repr(loadRaw(name)) 现在会得到可再次读入的 &(expr) 形式 +loadRawAttr(obj, name) // 读取 obj.name,但不自动执行 computed。name 必须是字符串 +loadRawItem(obj, key) // 读取 obj[key],但不自动执行 computed repr(obj) // 将对象转化为供解释器读取的形式 load(name) // 根据给出的名字,获取对象。 load('a') == a diff --git a/parser_errors.go b/parser_errors.go index 73b58359..46c0760c 100644 --- a/parser_errors.go +++ b/parser_errors.go @@ -50,20 +50,25 @@ var errMsgs = map[string]bilingualMsg{ "syntax": {"语法错误", "Syntax error"}, } -func init() { - // 注册错误格式化钩子 - ErrorFormatter = formatFriendlyError -} - // SetParseErrorLanguage 设置解析错误消息的语言 func SetParseErrorLanguage(lang int) { parseErrorLanguage = lang } +func parseErrorFormatterOption(lang int) option { + return noMatchErrorFormatter(func(pos position, input []byte, expected []string) error { + return formatFriendlyErrorForLanguage(lang, pos, input, expected) + }) +} + // formatFriendlyError 生成友好的错误消息 func formatFriendlyError(pos position, input []byte, expected []string) error { + return formatFriendlyErrorForLanguage(parseErrorLanguage, pos, input, expected) +} + +func formatFriendlyErrorForLanguage(lang int, pos position, input []byte, expected []string) error { if len(input) == 0 { - return fmtErr(pos, input, errMsgs["empty"], 0) + return fmtErr(lang, pos, input, errMsgs["empty"], 0) } var char rune @@ -115,15 +120,15 @@ func formatFriendlyError(pos position, input []byte, expected []string) error { msg = errMsgs["syntax"] } - return fmtErr(pos, input, msg, fmtChar) + return fmtErr(lang, pos, input, msg, fmtChar) } // fmtErr 格式化错误输出 -func fmtErr(pos position, input []byte, msg bilingualMsg, char rune) error { +func fmtErr(lang int, pos position, input []byte, msg bilingualMsg, char rune) error { var sb strings.Builder // 标题 - switch parseErrorLanguage { + switch lang { case ParseErrorLanguageChinese: sb.WriteString("语法错误\n") case ParseErrorLanguageEnglish: @@ -156,7 +161,7 @@ func fmtErr(pos position, input []byte, msg bilingualMsg, char rune) error { } // 位置和消息 - switch parseErrorLanguage { + switch lang { case ParseErrorLanguageChinese: sb.WriteString(fmt.Sprintf(" 位置 %d:%d - %s", pos.line, pos.col, cn)) case ParseErrorLanguageEnglish: diff --git a/parser_errors_test.go b/parser_errors_test.go index 1fbfea67..71a9709e 100644 --- a/parser_errors_test.go +++ b/parser_errors_test.go @@ -148,6 +148,26 @@ func TestLanguageOptions_Bilingual(t *testing.T) { } } +func TestParseErrorFormatterOptionIsParserScoped(t *testing.T) { + pChinese := newParser("", []byte("/"), parseErrorFormatterOption(ParseErrorLanguageChinese)) + if assert.NotNil(t, pChinese.noMatchErrorFormatter) { + err := pChinese.noMatchErrorFormatter(position{line: 1, col: 1, offset: 0}, []byte("/"), []string{"expr"}) + if assert.Error(t, err) { + assert.Contains(t, err.Error(), "语法错误") + assert.NotContains(t, err.Error(), "Syntax Error") + } + } + + pEnglish := newParser("", []byte("/"), parseErrorFormatterOption(ParseErrorLanguageEnglish)) + if assert.NotNil(t, pEnglish.noMatchErrorFormatter) { + err := pEnglish.noMatchErrorFormatter(position{line: 1, col: 1, offset: 0}, []byte("/"), []string{"expr"}) + if assert.Error(t, err) { + assert.Contains(t, err.Error(), "Syntax Error") + assert.NotContains(t, err.Error(), "语法错误") + } + } +} + func TestErrorContext_ShowsCodeAndPointer(t *testing.T) { vm := NewVM() // 使用一个确实会产生错误的表达式 diff --git a/roll.peg b/roll.peg index 4664c806..bc915d57 100644 --- a/roll.peg +++ b/roll.peg @@ -319,11 +319,13 @@ value_id_without_colon <- id:identifierWithoutColon sp { c.data.WriteCode(typeLo value_array_range <- '[' sp exprRoot ".." sp exprRoot ']' sp { c.data.AddOp(typePushRange) } value_array <- '[' sp { c.data.CounterPush(); c.data.CounterAdd(1) } exprRoot (',' sp exprRoot {c.data.CounterAdd(1)} )* ']' sp { c.data.PushArray(c.data.CounterPop()) } +value_computed <- '&' parenOpen { c.data.CodePush(p.pt.offset) } text:< exprRoot > parenClose { c.data.AddStoreComputedOnStack(text.(string)) } value <- "true" sp { c.data.PushIntNumber("1"); } / "false" sp { c.data.PushIntNumber("0"); } / "null" sp { c.data.PushNull() } / "this" sp { c.data.PushThis() } item_get attr_get + / &value_computed value_computed attr_get / '&' id:identifier sp { c.data.WriteCode(typeLoadNameRaw, id.(string)); } attr_get / float diff --git a/roll.peg.go b/roll.peg.go index e1364b7a..c61b29b4 100644 --- a/roll.peg.go +++ b/roll.peg.go @@ -34,11 +34,6 @@ func stringsJoin(items any) string { return buf.String() } -// ErrorFormatter 是一个可选的错误格式化函数钩子 -// 当设置后,会用于格式化 "no match found" 类型的解析错误 -// Optional error formatter hook for formatting "no match found" parse errors -var ErrorFormatter func(pos position, input []byte, expected []string) error - var g = &grammar{ rules: []*rule{ { @@ -47,9 +42,9 @@ var g = &grammar{ run: (*parser).call_ondicescript_1, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 1 /* stmtSt */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -61,7 +56,7 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &litMatcher{val: "^st", want: "\"^st\""}, - &ruleIRefExpr{index: 130 /* st_expr */}, + &ruleIRefExpr{index: 131 /* st_expr */}, }, }, &ruleIRefExpr{index: 2 /* stmtRoot */}, @@ -73,7 +68,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 3 /* stmtLines */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -100,8 +95,8 @@ var g = &grammar{ }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 127 /* comment */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 128 /* comment */}, + &ruleIRefExpr{index: 124 /* sp */}, &zeroOrOneExpr{ expr: &ruleIRefExpr{index: 3 /* stmtLines */}, }, @@ -121,7 +116,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ";", want: "\";\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -141,14 +136,14 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "//", want: "\"//\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "#EnableDice", want: "\"#EnableDice\""}, - &ruleIRefExpr{index: 125 /* sp1x */}, + &ruleIRefExpr{index: 126 /* sp1x */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 125 /* sp1x */}, + &ruleIRefExpr{index: 126 /* sp1x */}, &labeledExpr{ label: "on", expr: &choiceExpr{ @@ -159,7 +154,7 @@ var g = &grammar{ }, textCapture: true, }, - &ruleIRefExpr{index: 128 /* commentLineRest */}, + &ruleIRefExpr{index: 129 /* commentLineRest */}, }, }, }, @@ -196,19 +191,19 @@ var g = &grammar{ alternatives: []any{ &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 126 /* spNoCR */}, + &ruleIRefExpr{index: 127 /* spNoCR */}, &litMatcher{val: "\n", want: "\"\\n\""}, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: ";", want: "\";\""}, }, }, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -225,7 +220,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "break", want: "\"break\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -237,7 +232,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "continue", want: "\"continue\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -251,7 +246,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "return", want: "\"return\""}, - &ruleIRefExpr{index: 125 /* sp1x */}, + &ruleIRefExpr{index: 126 /* sp1x */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -261,7 +256,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "return", want: "\"return\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -277,7 +272,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "while", want: "\"while\""}, - &ruleIRefExpr{index: 125 /* sp1x */}, + &ruleIRefExpr{index: 126 /* sp1x */}, }, }, }, @@ -286,7 +281,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -306,21 +301,21 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "}", want: "\"}\""}, }, }, &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 2 /* stmtRoot */}, &litMatcher{val: "}", want: "\"}\""}, }, }, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -333,13 +328,13 @@ var g = &grammar{ alternatives: []any{ &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 12 /* block */}, }, }, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 125 /* sp1x */}, + &ruleIRefExpr{index: 126 /* sp1x */}, &ruleIRefExpr{index: 14 /* stmtIf */}, }, }, @@ -353,7 +348,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "if", want: "\"if\""}, - &ruleIRefExpr{index: 125 /* sp1x */}, + &ruleIRefExpr{index: 126 /* sp1x */}, &choiceExpr{ alternatives: []any{ &seqExpr{ @@ -363,7 +358,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -395,9 +390,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: ")", want: "\")\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -408,7 +403,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -418,9 +413,9 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -434,12 +429,12 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "id2", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -450,7 +445,7 @@ var g = &grammar{ }, }, &litMatcher{val: ")", want: "\")\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -468,12 +463,12 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "func", want: "\"func\""}, - &ruleIRefExpr{index: 125 /* sp1x */}, + &ruleIRefExpr{index: 126 /* sp1x */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -483,7 +478,7 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 15 /* func_def_params */}, &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -499,7 +494,7 @@ var g = &grammar{ textCapture: true, }, &litMatcher{val: "}", want: "\"}\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -517,9 +512,9 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -528,7 +523,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -548,9 +543,9 @@ var g = &grammar{ &litMatcher{val: "&", want: "\"&\""}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -559,7 +554,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -586,9 +581,9 @@ var g = &grammar{ &litMatcher{val: "&", want: "\"&\""}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -599,9 +594,9 @@ var g = &grammar{ &litMatcher{val: ".", want: "\".\""}, &labeledExpr{ label: "id2", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -609,9 +604,9 @@ var g = &grammar{ run: (*parser).call_onstmtAssignType3_14, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -629,14 +624,14 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "this", want: "\"this\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: ".", want: "\".\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -645,7 +640,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -664,9 +659,9 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -675,12 +670,12 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ".", want: "\".\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "id2", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -689,7 +684,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -705,12 +700,12 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 30 /* exprSlice */}, &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -725,7 +720,7 @@ var g = &grammar{ &ruleIRefExpr{index: 30 /* exprSlice */}, &ruleIRefExpr{index: 28 /* _sliceSuffix */}, &litMatcher{val: "=", want: "\"=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, @@ -803,8 +798,8 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 103 /* subX */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 104 /* subX */}, + &ruleIRefExpr{index: 124 /* sp */}, &charClassMatcher{ val: "[-+*/%^dDcCaA&|?<>=]", chars: []rune{'-', '+', '*', '/', '%', '^', 'd', 'D', 'c', 'C', 'a', 'A', '&', '|', '?', '<', '>', '='}, @@ -823,9 +818,9 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &andExpr{ - expr: &ruleIRefExpr{index: 103 /* subX */}, + expr: &ruleIRefExpr{index: 104 /* subX */}, }, - &ruleIRefExpr{index: 103 /* subX */}, + &ruleIRefExpr{index: 104 /* subX */}, }, }, }, @@ -848,13 +843,13 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &litMatcher{val: ":", want: "\":\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, &actionExpr{ run: (*parser).call_on_step_7, - expr: &ruleIRefExpr{index: 123 /* sp */}, + expr: &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -862,7 +857,7 @@ var g = &grammar{ }, &actionExpr{ run: (*parser).call_on_step_9, - expr: &ruleIRefExpr{index: 123 /* sp */}, + expr: &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -872,31 +867,31 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, &actionExpr{ run: (*parser).call_on_sliceSuffix_6, - expr: &ruleIRefExpr{index: 123 /* sp */}, + expr: &ruleIRefExpr{index: 124 /* sp */}, }, }, }, &litMatcher{val: ":", want: "\":\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, &actionExpr{ run: (*parser).call_on_sliceSuffix_12, - expr: &ruleIRefExpr{index: 123 /* sp */}, + expr: &ruleIRefExpr{index: 124 /* sp */}, }, }, }, &ruleIRefExpr{index: 27 /* _step */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -940,9 +935,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "?", want: "\"?\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -951,7 +946,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -967,9 +962,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "?", want: "\"?\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -978,9 +973,9 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: ":", want: "\":\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -989,7 +984,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 35 /* exprLogicOr */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -1012,7 +1007,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 31 /* exprValueIfExists */}, }, }, @@ -1058,8 +1053,8 @@ var g = &grammar{ run: (*parser).call_onexprLogicOr_5, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 115 /* logicOr */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 116 /* logicOr */}, }, }, }, @@ -1086,8 +1081,8 @@ var g = &grammar{ run: (*parser).call_onexprLogicAnd_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 116 /* logicAnd */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 117 /* logicAnd */}, &ruleIRefExpr{index: 37 /* exprBitwiseOr */}, }, }, @@ -1114,8 +1109,8 @@ var g = &grammar{ run: (*parser).call_onexprBitwiseOr_8, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 113 /* bitwiseOr */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 114 /* bitwiseOr */}, &ruleIRefExpr{index: 38 /* exprBitwiseAnd */}, }, }, @@ -1136,8 +1131,8 @@ var g = &grammar{ run: (*parser).call_onexprBitwiseAnd_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 114 /* bitwiseAnd */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 115 /* bitwiseAnd */}, &ruleIRefExpr{index: 39 /* exprCompare */}, }, }, @@ -1154,14 +1149,14 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ run: (*parser).call_onexprCompare_7, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 117 /* lt */}, + &ruleIRefExpr{index: 118 /* lt */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1170,7 +1165,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_11, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 119 /* le */}, + &ruleIRefExpr{index: 120 /* le */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1179,7 +1174,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_15, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 121 /* eq */}, + &ruleIRefExpr{index: 122 /* eq */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1188,7 +1183,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_19, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 122 /* ne */}, + &ruleIRefExpr{index: 123 /* ne */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1197,7 +1192,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_23, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 120 /* ge */}, + &ruleIRefExpr{index: 121 /* ge */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1206,7 +1201,7 @@ var g = &grammar{ run: (*parser).call_onexprCompare_27, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 118 /* gt */}, + &ruleIRefExpr{index: 119 /* gt */}, &ruleIRefExpr{index: 40 /* exprAdditive */}, }, }, @@ -1227,14 +1222,14 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ run: (*parser).call_onexprAdditive_7, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 106 /* add */}, + &ruleIRefExpr{index: 107 /* add */}, &ruleIRefExpr{index: 41 /* exprMultiplicative */}, }, }, @@ -1243,7 +1238,7 @@ var g = &grammar{ run: (*parser).call_onexprAdditive_11, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 107 /* minus */}, + &ruleIRefExpr{index: 108 /* minus */}, &ruleIRefExpr{index: 41 /* exprMultiplicative */}, }, }, @@ -1264,14 +1259,14 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ run: (*parser).call_onexprMultiplicative_7, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 108 /* multiply */}, + &ruleIRefExpr{index: 109 /* multiply */}, &ruleIRefExpr{index: 43 /* exprExp */}, }, }, @@ -1280,7 +1275,7 @@ var g = &grammar{ run: (*parser).call_onexprMultiplicative_11, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 109 /* divide */}, + &ruleIRefExpr{index: 110 /* divide */}, &ruleIRefExpr{index: 43 /* exprExp */}, }, }, @@ -1289,7 +1284,7 @@ var g = &grammar{ run: (*parser).call_onexprMultiplicative_15, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 110 /* modulus */}, + &ruleIRefExpr{index: 111 /* modulus */}, &ruleIRefExpr{index: 43 /* exprExp */}, }, }, @@ -1312,8 +1307,8 @@ var g = &grammar{ run: (*parser).call_onexprNullCoalescing_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 112 /* nullCoalescing */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 113 /* nullCoalescing */}, &ruleIRefExpr{index: 43 /* exprExp */}, }, }, @@ -1332,8 +1327,8 @@ var g = &grammar{ run: (*parser).call_onexprExp_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 111 /* exponentiation */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 112 /* exponentiation */}, &ruleIRefExpr{index: 44 /* exprUnaryNeg */}, }, }, @@ -1350,7 +1345,7 @@ var g = &grammar{ run: (*parser).call_onexprUnaryNeg_2, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 107 /* minus */}, + &ruleIRefExpr{index: 108 /* minus */}, &ruleIRefExpr{index: 69 /* exprDice */}, }, }, @@ -1367,7 +1362,7 @@ var g = &grammar{ run: (*parser).call_onexprUnaryPos_2, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 106 /* add */}, + &ruleIRefExpr{index: 107 /* add */}, &ruleIRefExpr{index: 69 /* exprDice */}, }, }, @@ -1380,8 +1375,8 @@ var g = &grammar{ name: "nos", expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 82 /* number */}, - &ruleIRefExpr{index: 102 /* sub */}, + &ruleIRefExpr{index: 83 /* number */}, + &ruleIRefExpr{index: 103 /* sub */}, }, }, }, @@ -1590,7 +1585,7 @@ var g = &grammar{ &litMatcher{val: "劣势", want: "\"劣势\""}, &litMatcher{val: "劣勢", want: "\"劣勢\""}, ¬Expr{ - expr: &ruleIRefExpr{index: 100 /* xidStart */}, + expr: &ruleIRefExpr{index: 101 /* xidStart */}, }, }, }, @@ -1780,7 +1775,7 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 61 /* _wodTypeMain */}, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, @@ -1855,12 +1850,12 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 46 /* nos */}, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, @@ -1883,14 +1878,14 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 46 /* nos */}, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, &actionExpr{ run: (*parser).call_on_diceCocBonus_9, expr: ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, @@ -1916,14 +1911,14 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 46 /* nos */}, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, &actionExpr{ run: (*parser).call_on_diceCocPenalty_9, expr: ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, @@ -1966,7 +1961,7 @@ var g = &grammar{ chars: []rune{'f', 'F'}, }, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, @@ -2131,7 +2126,7 @@ var g = &grammar{ exprs: []any{ &ruleIRefExpr{index: 63 /* _wodMain */}, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, @@ -2204,13 +2199,13 @@ var g = &grammar{ chars: []rune{'f', 'F'}, }, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, &ruleIRefExpr{index: 48 /* detailEnd */}, }, }, }, - &ruleIRefExpr{index: 81 /* value */}, + &ruleIRefExpr{index: 82 /* value */}, }, }, }, @@ -2228,7 +2223,7 @@ var g = &grammar{ alternatives: []any{ &actionExpr{ run: (*parser).call_onarray_call_6, - expr: &ruleIRefExpr{index: 82 /* number */}, + expr: &ruleIRefExpr{index: 83 /* number */}, }, &codeExpr{ run: (*parser).call_onarray_call_8, @@ -2247,7 +2242,7 @@ var g = &grammar{ alternatives: []any{ &actionExpr{ run: (*parser).call_onarray_call_13, - expr: &ruleIRefExpr{index: 82 /* number */}, + expr: &ruleIRefExpr{index: 83 /* number */}, }, &codeExpr{ run: (*parser).call_onarray_call_15, @@ -2262,11 +2257,11 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2284,11 +2279,11 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, ¬Expr{ expr: &litMatcher{val: "=", want: "\"=\""}, }, @@ -2326,12 +2321,12 @@ var g = &grammar{ run: (*parser).call_onattr_getX_4, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2364,7 +2359,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2373,20 +2368,20 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &zeroOrMoreExpr{ expr: &actionExpr{ run: (*parser).call_onfunc_invoke2_11, expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: ")", want: "\")\""}, }, }, @@ -2403,7 +2398,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: ")", want: "\")\""}, }, }, @@ -2433,13 +2428,13 @@ var g = &grammar{ &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: ":", want: "\":\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2455,9 +2450,9 @@ var g = &grammar{ exprs: []any{ &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 99 /* identifierWithoutColon */}, + expr: &ruleIRefExpr{index: 100 /* identifierWithoutColon */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2480,13 +2475,13 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, &litMatcher{val: "..", want: "\"..\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2500,7 +2495,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2515,14 +2510,44 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 26 /* exprRoot */}, }, }, }, }, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, + }, + }, + }, + }, + }, + }, + { + name: "value_computed", + varExists: true, + expr: &seqExpr{ + exprs: []any{ + &actionExpr{ + run: (*parser).call_onvalue_computed_2, + expr: &seqExpr{ + exprs: []any{ + &litMatcher{val: "&", want: "\"&\""}, + &ruleIRefExpr{index: 105 /* parenOpen */}, + }, + }, + }, + &actionExpr{ + run: (*parser).call_onvalue_computed_6, + expr: &seqExpr{ + exprs: []any{ + &labeledExpr{ + label: "text", + expr: &ruleIRefExpr{index: 26 /* exprRoot */}, + textCapture: true, + }, + &ruleIRefExpr{index: 106 /* parenClose */}, }, }, }, @@ -2539,7 +2564,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "true", want: "\"true\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2548,7 +2573,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "false", want: "\"false\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2557,7 +2582,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "null", want: "\"null\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2568,7 +2593,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "this", want: "\"this\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2580,47 +2605,56 @@ var g = &grammar{ }, }, }, + &seqExpr{ + exprs: []any{ + &andExpr{ + expr: &ruleIRefExpr{index: 81 /* value_computed */}, + }, + &ruleIRefExpr{index: 81 /* value_computed */}, + &ruleIRefExpr{index: 74 /* attr_get */}, + }, + }, &seqExpr{ exprs: []any{ &actionExpr{ - run: (*parser).call_onvalue_23, + run: (*parser).call_onvalue_28, expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&", want: "\"&\""}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, &ruleIRefExpr{index: 74 /* attr_get */}, }, }, - &ruleIRefExpr{index: 83 /* float */}, - &ruleIRefExpr{index: 82 /* number */}, + &ruleIRefExpr{index: 84 /* float */}, + &ruleIRefExpr{index: 83 /* number */}, &seqExpr{ exprs: []any{ &actionExpr{ - run: (*parser).call_onvalue_33, + run: (*parser).call_onvalue_38, expr: &seqExpr{ exprs: []any{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 98 /* identifier */}, - &ruleIRefExpr{index: 126 /* spNoCR */}, + &ruleIRefExpr{index: 99 /* identifier */}, + &ruleIRefExpr{index: 127 /* spNoCR */}, }, }, }, &ruleIRefExpr{index: 47 /* detailStart */}, &labeledExpr{ label: "id", - expr: &ruleIRefExpr{index: 98 /* identifier */}, + expr: &ruleIRefExpr{index: 99 /* identifier */}, }, &ruleIRefExpr{index: 48 /* detailEnd */}, - &ruleIRefExpr{index: 126 /* spNoCR */}, + &ruleIRefExpr{index: 127 /* spNoCR */}, }, }, }, @@ -2635,10 +2669,10 @@ var g = &grammar{ }, }, }, - &ruleIRefExpr{index: 95 /* fstring */}, + &ruleIRefExpr{index: 96 /* fstring */}, &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 102 /* sub */}, + &ruleIRefExpr{index: 103 /* sub */}, &ruleIRefExpr{index: 72 /* item_get */}, &ruleIRefExpr{index: 74 /* attr_get */}, }, @@ -2646,13 +2680,13 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &actionExpr{ - run: (*parser).call_onvalue_55, + run: (*parser).call_onvalue_60, expr: &seqExpr{ exprs: []any{ &litMatcher{val: "[", want: "\"[\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "]", want: "\"]\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2693,13 +2727,13 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &actionExpr{ - run: (*parser).call_onvalue_80, + run: (*parser).call_onvalue_85, expr: &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "}", want: "\"}\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2714,16 +2748,16 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &actionExpr{ - run: (*parser).call_onvalue_90, + run: (*parser).call_onvalue_95, expr: &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, &actionExpr{ - run: (*parser).call_onvalue_94, + run: (*parser).call_onvalue_99, expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 77 /* dict_item */}, @@ -2731,7 +2765,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ",", want: "\",\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &ruleIRefExpr{index: 77 /* dict_item */}, }, }, @@ -2740,7 +2774,7 @@ var g = &grammar{ expr: &litMatcher{val: ",", want: "\",\""}, }, &litMatcher{val: "}", want: "\"}\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -2800,8 +2834,8 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 92 /* strEscape */}, - &ruleIRefExpr{index: 85 /* strPart1Normal */}, + &ruleIRefExpr{index: 93 /* strEscape */}, + &ruleIRefExpr{index: 86 /* strPart1Normal */}, }, }, }, @@ -2838,8 +2872,8 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 92 /* strEscape */}, - &ruleIRefExpr{index: 87 /* strPart2Normal */}, + &ruleIRefExpr{index: 93 /* strEscape */}, + &ruleIRefExpr{index: 88 /* strPart2Normal */}, }, }, }, @@ -2876,8 +2910,8 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 92 /* strEscape */}, - &ruleIRefExpr{index: 89 /* strPart3Normal */}, + &ruleIRefExpr{index: 93 /* strEscape */}, + &ruleIRefExpr{index: 90 /* strPart3Normal */}, }, }, }, @@ -2914,8 +2948,8 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 92 /* strEscape */}, - &ruleIRefExpr{index: 91 /* strPart4Normal */}, + &ruleIRefExpr{index: 93 /* strEscape */}, + &ruleIRefExpr{index: 92 /* strPart4Normal */}, }, }, }, @@ -2994,7 +3028,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "{%", want: "\"{%\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &seqExpr{ @@ -3011,7 +3045,7 @@ var g = &grammar{ &andCodeExpr{run: (*parser).call_onfstringStmt_9}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "%}", want: "\"%}\""}, }, }, @@ -3021,7 +3055,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "{", want: "\"{\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &seqExpr{ @@ -3038,7 +3072,7 @@ var g = &grammar{ &andCodeExpr{run: (*parser).call_onfstringStmt2_9}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "}", want: "\"}\""}, }, }, @@ -3096,7 +3130,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 84 /* strPart1 */}, + expr: &ruleIRefExpr{index: 85 /* strPart1 */}, }, &litMatcher{val: "'", want: "\"'\""}, }, @@ -3115,7 +3149,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 86 /* strPart2 */}, + expr: &ruleIRefExpr{index: 87 /* strPart2 */}, }, &litMatcher{val: "\"", want: "\"\\\"\""}, }, @@ -3136,9 +3170,9 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 88 /* strPart3 */}, - &ruleIRefExpr{index: 93 /* fstringStmt */}, - &ruleIRefExpr{index: 94 /* fstringStmt2 */}, + &ruleIRefExpr{index: 89 /* strPart3 */}, + &ruleIRefExpr{index: 94 /* fstringStmt */}, + &ruleIRefExpr{index: 95 /* fstringStmt2 */}, }, }, }, @@ -3161,9 +3195,9 @@ var g = &grammar{ &zeroOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 90 /* strPart4 */}, - &ruleIRefExpr{index: 93 /* fstringStmt */}, - &ruleIRefExpr{index: 94 /* fstringStmt2 */}, + &ruleIRefExpr{index: 91 /* strPart4 */}, + &ruleIRefExpr{index: 94 /* fstringStmt */}, + &ruleIRefExpr{index: 95 /* fstringStmt2 */}, }, }, }, @@ -3175,7 +3209,7 @@ var g = &grammar{ }, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3199,9 +3233,9 @@ var g = &grammar{ expr: ¬Expr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 96 /* keywords */}, + &ruleIRefExpr{index: 97 /* keywords */}, ¬Expr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, &andCodeExpr{run: (*parser).call_onkeywords_test_6}, }, @@ -3214,12 +3248,12 @@ var g = &grammar{ run: (*parser).call_onidentifier_1, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 97 /* keywords_test */}, - &ruleIRefExpr{index: 100 /* xidStart */}, + &ruleIRefExpr{index: 98 /* keywords_test */}, + &ruleIRefExpr{index: 101 /* xidStart */}, &zeroOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 101 /* xidContinue */}, + &ruleIRefExpr{index: 102 /* xidContinue */}, &litMatcher{val: ":", want: "\":\""}, }, }, @@ -3234,10 +3268,10 @@ var g = &grammar{ run: (*parser).call_onidentifierWithoutColon_1, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 97 /* keywords_test */}, - &ruleIRefExpr{index: 100 /* xidStart */}, + &ruleIRefExpr{index: 98 /* keywords_test */}, + &ruleIRefExpr{index: 101 /* xidStart */}, &zeroOrMoreExpr{ - expr: &ruleIRefExpr{index: 101 /* xidContinue */}, + expr: &ruleIRefExpr{index: 102 /* xidContinue */}, }, }, }, @@ -3266,15 +3300,15 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 104 /* parenOpen */}, + &ruleIRefExpr{index: 105 /* parenOpen */}, &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 105 /* parenClose */}, + &ruleIRefExpr{index: 106 /* parenClose */}, }, }, }, - &ruleIRefExpr{index: 104 /* parenOpen */}, + &ruleIRefExpr{index: 105 /* parenOpen */}, &ruleIRefExpr{index: 26 /* exprRoot */}, - &ruleIRefExpr{index: 105 /* parenClose */}, + &ruleIRefExpr{index: 106 /* parenClose */}, }, }, }, @@ -3282,7 +3316,7 @@ var g = &grammar{ name: "subX", expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 102 /* sub */}, + &ruleIRefExpr{index: 103 /* sub */}, &ruleIRefExpr{index: 72 /* item_get */}, &ruleIRefExpr{index: 74 /* attr_get */}, }, @@ -3293,7 +3327,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "(", want: "\"(\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3302,7 +3336,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ")", want: "\")\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3316,7 +3350,7 @@ var g = &grammar{ &litMatcher{val: "+", want: "\"+\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3330,7 +3364,7 @@ var g = &grammar{ &litMatcher{val: "-", want: "\"-\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3344,7 +3378,7 @@ var g = &grammar{ &litMatcher{val: "*", want: "\"*\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3358,7 +3392,7 @@ var g = &grammar{ &litMatcher{val: "/", want: "\"/\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3367,7 +3401,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "%", want: "\"%\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3378,13 +3412,13 @@ var g = &grammar{ &seqExpr{ exprs: []any{ &litMatcher{val: "^", want: "\"^\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, &seqExpr{ exprs: []any{ &litMatcher{val: "**", want: "\"**\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3395,7 +3429,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "??", want: "\"??\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3404,7 +3438,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "|", want: "\"|\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3413,7 +3447,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3422,7 +3456,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "||", want: "\"||\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3431,7 +3465,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&&", want: "\"&&\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3440,7 +3474,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "<", want: "\"<\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3449,7 +3483,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ">", want: "\">\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3458,7 +3492,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "<=", want: "\"<=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3467,7 +3501,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: ">=", want: "\">=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3476,7 +3510,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "==", want: "\"==\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3485,7 +3519,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "!=", want: "\"!=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3510,7 +3544,7 @@ var g = &grammar{ val: "[ \\n\\t\\r]", chars: []rune{' ', '\n', '\t', '\r'}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, ¬Expr{ @@ -3523,8 +3557,8 @@ var g = &grammar{ name: "sp1x", expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 124 /* sp1 */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 125 /* sp1 */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3541,9 +3575,9 @@ var g = &grammar{ name: "comment", expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 126 /* spNoCR */}, + &ruleIRefExpr{index: 127 /* spNoCR */}, &litMatcher{val: "//", want: "\"//\""}, - &ruleIRefExpr{index: 128 /* commentLineRest */}, + &ruleIRefExpr{index: 129 /* commentLineRest */}, }, }, }, @@ -3606,8 +3640,8 @@ var g = &grammar{ name: "st_expr", expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 135 /* st_modify_multi_1 */}, - &ruleIRefExpr{index: 132 /* st_assign_multi */}, + &ruleIRefExpr{index: 136 /* st_modify_multi_1 */}, + &ruleIRefExpr{index: 133 /* st_assign_multi */}, }, }, }, @@ -3645,12 +3679,12 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 134 /* st_assign */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 135 /* st_assign */}, + &ruleIRefExpr{index: 124 /* sp */}, &zeroOrOneExpr{ expr: &litMatcher{val: ",", want: "\",\""}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3660,12 +3694,12 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "*", want: "\"*\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 83 /* float */}, - &ruleIRefExpr{index: 82 /* number */}, - &ruleIRefExpr{index: 102 /* sub */}, + &ruleIRefExpr{index: 84 /* float */}, + &ruleIRefExpr{index: 83 /* number */}, + &ruleIRefExpr{index: 103 /* sub */}, }, }, }, @@ -3683,29 +3717,29 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 142 /* st_name2 */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2 */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, - &ruleIRefExpr{index: 142 /* st_name2 */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2 */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, @@ -3716,13 +3750,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 140 /* st_name1 */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 141 /* st_name1 */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, - &ruleIRefExpr{index: 140 /* st_name1 */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 141 /* st_name1 */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, @@ -3733,33 +3767,33 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 133 /* st_star */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 134 /* st_star */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 133 /* st_star */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 134 /* st_star */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, @@ -3770,33 +3804,33 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "*", want: "\"*\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 124 /* sp */}, &litMatcher{val: "*", want: "\"*\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, @@ -3807,29 +3841,29 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 124 /* sp */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, @@ -3840,13 +3874,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 141 /* st_name1r */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 142 /* st_name1r */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, - &ruleIRefExpr{index: 141 /* st_name1r */}, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 142 /* st_name1r */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, @@ -3860,28 +3894,28 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 142 /* st_name2 */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2 */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 142 /* st_name2 */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 143 /* st_name2 */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3889,7 +3923,7 @@ var g = &grammar{ run: (*parser).call_onst_assign_117, expr: &labeledExpr{ label: "text", - expr: &ruleIRefExpr{index: 131 /* est */}, + expr: &ruleIRefExpr{index: 132 /* est */}, textCapture: true, }, }, @@ -3905,28 +3939,28 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 131 /* est */}, + &ruleIRefExpr{index: 132 /* est */}, }, }, }, &litMatcher{val: "&", want: "\"&\""}, - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &litMatcher{val: ":", want: "\":\""}, &litMatcher{val: "=", want: "\"=\""}, }, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -3934,7 +3968,7 @@ var g = &grammar{ run: (*parser).call_onst_assign_139, expr: &labeledExpr{ label: "text", - expr: &ruleIRefExpr{index: 131 /* est */}, + expr: &ruleIRefExpr{index: 132 /* est */}, textCapture: true, }, }, @@ -3949,15 +3983,15 @@ var g = &grammar{ exprs: []any{ &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 136 /* st_modify_lead */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 137 /* st_modify_lead */}, + &ruleIRefExpr{index: 124 /* sp */}, &zeroOrOneExpr{ expr: &litMatcher{val: ",", want: "\",\""}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, - &ruleIRefExpr{index: 137 /* st_modify_multi_rest */}, + &ruleIRefExpr{index: 138 /* st_modify_multi_rest */}, }, }, }, @@ -3970,13 +4004,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 142 /* st_name2 */}, - &ruleIRefExpr{index: 138 /* st_modify_rest1 */}, + &ruleIRefExpr{index: 143 /* st_name2 */}, + &ruleIRefExpr{index: 139 /* st_modify_rest1 */}, }, }, }, - &ruleIRefExpr{index: 142 /* st_name2 */}, - &ruleIRefExpr{index: 138 /* st_modify_rest1 */}, + &ruleIRefExpr{index: 143 /* st_name2 */}, + &ruleIRefExpr{index: 139 /* st_modify_rest1 */}, }, }, &seqExpr{ @@ -3984,13 +4018,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 138 /* st_modify_rest1 */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 139 /* st_modify_rest1 */}, }, }, }, - &ruleIRefExpr{index: 143 /* st_name2r */}, - &ruleIRefExpr{index: 138 /* st_modify_rest1 */}, + &ruleIRefExpr{index: 144 /* st_name2r */}, + &ruleIRefExpr{index: 139 /* st_modify_rest1 */}, }, }, &seqExpr{ @@ -3998,13 +4032,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 140 /* st_name1 */}, - &ruleIRefExpr{index: 139 /* st_modify_rest */}, + &ruleIRefExpr{index: 141 /* st_name1 */}, + &ruleIRefExpr{index: 140 /* st_modify_rest */}, }, }, }, - &ruleIRefExpr{index: 140 /* st_name1 */}, - &ruleIRefExpr{index: 139 /* st_modify_rest */}, + &ruleIRefExpr{index: 141 /* st_name1 */}, + &ruleIRefExpr{index: 140 /* st_modify_rest */}, }, }, &seqExpr{ @@ -4012,13 +4046,13 @@ var g = &grammar{ &andExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 141 /* st_name1r */}, - &ruleIRefExpr{index: 139 /* st_modify_rest */}, + &ruleIRefExpr{index: 142 /* st_name1r */}, + &ruleIRefExpr{index: 140 /* st_modify_rest */}, }, }, }, - &ruleIRefExpr{index: 141 /* st_name1r */}, - &ruleIRefExpr{index: 139 /* st_modify_rest */}, + &ruleIRefExpr{index: 142 /* st_name1r */}, + &ruleIRefExpr{index: 140 /* st_modify_rest */}, }, }, }, @@ -4029,12 +4063,12 @@ var g = &grammar{ expr: &zeroOrMoreExpr{ expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 136 /* st_modify_lead */}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 137 /* st_modify_lead */}, + &ruleIRefExpr{index: 124 /* sp */}, &zeroOrOneExpr{ expr: &litMatcher{val: ",", want: "\",\""}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, }, }, }, @@ -4044,7 +4078,7 @@ var g = &grammar{ varExists: true, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ @@ -4052,7 +4086,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "+=", want: "\"+=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -4066,7 +4100,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "-=", want: "\"-=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -4085,7 +4119,7 @@ var g = &grammar{ varExists: true, expr: &seqExpr{ exprs: []any{ - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &choiceExpr{ alternatives: []any{ &actionExpr{ @@ -4096,7 +4130,7 @@ var g = &grammar{ &zeroOrOneExpr{ expr: &litMatcher{val: "=", want: "\"=\""}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -4110,7 +4144,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &litMatcher{val: "-=", want: "\"-=\""}, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -4126,7 +4160,7 @@ var g = &grammar{ &andExpr{ expr: &litMatcher{val: "-", want: "\"-\""}, }, - &ruleIRefExpr{index: 123 /* sp */}, + &ruleIRefExpr{index: 124 /* sp */}, &labeledExpr{ label: "text", expr: &ruleIRefExpr{index: 26 /* exprRoot */}, @@ -4150,11 +4184,11 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &oneOrMoreExpr{ - expr: &ruleIRefExpr{index: 144 /* id_ch */}, + expr: &ruleIRefExpr{index: 145 /* id_ch */}, }, &litMatcher{val: ":", want: "\":\""}, &oneOrMoreExpr{ - expr: &ruleIRefExpr{index: 144 /* id_ch */}, + expr: &ruleIRefExpr{index: 145 /* id_ch */}, }, }, }, @@ -4172,7 +4206,7 @@ var g = &grammar{ expr: &labeledExpr{ label: "text", expr: &oneOrMoreExpr{ - expr: &ruleIRefExpr{index: 144 /* id_ch */}, + expr: &ruleIRefExpr{index: 145 /* id_ch */}, }, textCapture: true, }, @@ -4187,7 +4221,7 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 144 /* id_ch */}, + &ruleIRefExpr{index: 145 /* id_ch */}, &charClassMatcher{ val: "[0-9]", ranges: []rune{'0', '9'}, @@ -4208,7 +4242,7 @@ var g = &grammar{ }, { name: "st_name2", - expr: &ruleIRefExpr{index: 140 /* st_name1 */}, + expr: &ruleIRefExpr{index: 141 /* st_name1 */}, }, { name: "st_name2r", @@ -4220,7 +4254,7 @@ var g = &grammar{ expr: &labeledExpr{ label: "text", expr: &oneOrMoreExpr{ - expr: &ruleIRefExpr{index: 144 /* id_ch */}, + expr: &ruleIRefExpr{index: 145 /* id_ch */}, }, textCapture: true, }, @@ -4235,7 +4269,7 @@ var g = &grammar{ expr: &oneOrMoreExpr{ expr: &choiceExpr{ alternatives: []any{ - &ruleIRefExpr{index: 144 /* id_ch */}, + &ruleIRefExpr{index: 145 /* id_ch */}, &charClassMatcher{ val: "[0-9]", ranges: []rune{'0', '9'}, @@ -4256,7 +4290,7 @@ var g = &grammar{ }, { name: "id_ch", - expr: &ruleIRefExpr{index: 100 /* xidStart */}, + expr: &ruleIRefExpr{index: 101 /* xidStart */}, }, }, } @@ -5324,6 +5358,21 @@ func (p *parser) call_onvalue_array_6() any { })(&p.cur) } +func (p *parser) call_onvalue_computed_2() any { + return (func(c *current) any { + c.data.CodePush(p.pt.offset) + return nil + })(&p.cur) +} + +func (p *parser) call_onvalue_computed_6() any { + stack := p.vstack[len(p.vstack)-1] + return (func(c *current, text any) any { + c.data.AddStoreComputedOnStack(text.(string)) + return nil + })(&p.cur, stack["text"]) +} + func (p *parser) call_onvalue_2() any { return (func(c *current) any { c.data.PushIntNumber("1") @@ -5352,7 +5401,7 @@ func (p *parser) call_onvalue_15() any { })(&p.cur) } -func (p *parser) call_onvalue_23() any { +func (p *parser) call_onvalue_28() any { stack := p.vstack[len(p.vstack)-1] return (func(c *current, id any) any { c.data.WriteCode(typeLoadNameRaw, id.(string)) @@ -5360,7 +5409,7 @@ func (p *parser) call_onvalue_23() any { })(&p.cur, stack["id"]) } -func (p *parser) call_onvalue_33() any { +func (p *parser) call_onvalue_38() any { stack := p.vstack[len(p.vstack)-1] return (func(c *current, id any) any { c.data.WriteCode(typeLoadNameWithDetail, id.(string)) @@ -5368,28 +5417,28 @@ func (p *parser) call_onvalue_33() any { })(&p.cur, stack["id"]) } -func (p *parser) call_onvalue_55() any { +func (p *parser) call_onvalue_60() any { return (func(c *current) any { c.data.PushArray(0) return nil })(&p.cur) } -func (p *parser) call_onvalue_80() any { +func (p *parser) call_onvalue_85() any { return (func(c *current) any { c.data.PushDict(0) return nil })(&p.cur) } -func (p *parser) call_onvalue_90() any { +func (p *parser) call_onvalue_95() any { return (func(c *current) any { c.data.CounterPush() return nil })(&p.cur) } -func (p *parser) call_onvalue_94() any { +func (p *parser) call_onvalue_99() any { return (func(c *current) any { c.data.PushDict(c.data.CounterPop()) return nil @@ -5918,6 +5967,14 @@ func (ss *parserStack) top() *savepoint { // the previous setting as an option. type option func(*parser) option +func noMatchErrorFormatter(fn func(position, []byte, []string) error) option { + return func(p *parser) option { + old := p.noMatchErrorFormatter + p.noMatchErrorFormatter = fn + return noMatchErrorFormatter(old) + } +} + func memoized(b bool) option { return func(p *parser) option { old := p.memoized @@ -6187,6 +6244,7 @@ type parser struct { maxFailPos position maxFailExpected []string maxFailInvertExpected bool + noMatchErrorFormatter func(position, []byte, []string) error // max number of expressions to be parsed maxExprCnt uint64 @@ -6348,6 +6406,16 @@ func (p *parser) addErrAt(err error, pos position, expected []string) { p.errs.add(pe) } +func (p *parser) buildNoMatchError(pos position, expected []string) error { + if p.noMatchErrorFormatter != nil { + if err := p.noMatchErrorFormatter(pos, p.data, expected); err != nil { + return err + } + } + + return errors.New("no match found, expected: " + listJoin(expected, ", ", "or")) +} + func (p *parser) failAt(fail bool, pos *position, want string) { // process fail if parsing fails and not inverted or parsing succeeds and invert is set if fail == p.maxFailInvertExpected { @@ -6470,11 +6538,7 @@ func (p *parser) parse(grammar *grammar) (val any, err error) { if eof { expected = append(expected, "EOF") } - if ErrorFormatter != nil { - p.addErrAt(ErrorFormatter(p.maxFailPos, p.data, expected), p.maxFailPos, expected) - } else { - p.addErrAt(errors.New("no match found, expected: "+listJoin(expected, ", ", "or")), p.maxFailPos, expected) - } + p.addErrAt(p.buildNoMatchError(p.maxFailPos, expected), p.maxFailPos, expected) } return nil, p.errs.err() diff --git a/rollvm.go b/rollvm.go index 3cb2b46e..3ef59031 100644 --- a/rollvm.go +++ b/rollvm.go @@ -70,7 +70,7 @@ func (ctx *Context) Parse(value string) error { return errors.New("正在执行中,无法执行新的语句") } - p := newParser("", []byte(value), memoized(true)) + p := newParser("", []byte(value), memoized(true), parseErrorFormatterOption(ctx.Config.ParseErrorLanguage)) ctx.parser = p d := p.cur.data // p.debug = true @@ -89,8 +89,6 @@ func (ctx *Context) Parse(value string) error { if ctx.Config.ParseExprLimit != 0 { p.maxExprCnt = ctx.Config.ParseExprLimit } - // 设置错误消息语言 - SetParseErrorLanguage(ctx.Config.ParseErrorLanguage) _, err := p.parse(nil) if err != nil { ctx.Error = err diff --git a/rollvm_st_test.go b/rollvm_st_test.go index 84bd3282..26eabf0b 100644 --- a/rollvm_st_test.go +++ b/rollvm_st_test.go @@ -110,6 +110,28 @@ func TestStSetCompute(t *testing.T) { assert.Equal(t, index, 2) } +func TestStSetComputeReprRoundTrip(t *testing.T) { + vm := NewVM() + var repr string + + vm.Config.CallbackSt = func(_type string, name string, val *VMValue, extra *VMValue, op string, detail string) { + assert.Equal(t, "set", _type) + assert.Equal(t, "Skill", name) + repr = val.ToRepr() + } + + err := vm.Run(`^st&Skill=1+2`) + if assert.NoError(t, err) { + assert.Equal(t, "&(1+2)", repr) + + vm2 := NewVM() + err = vm2.Run("a = " + repr + "; typeId(&a)") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm2.Ret, ni(IntType(VMTypeComputedValue)))) + } + } +} + func TestStSetComputeNamespaced(t *testing.T) { vm := NewVM() items := []checkItem{ diff --git a/rollvm_test.go b/rollvm_test.go index 89d73ab5..e7fd7f72 100644 --- a/rollvm_test.go +++ b/rollvm_test.go @@ -894,6 +894,62 @@ func TestArrayMethod(t *testing.T) { } } +func TestDictMethod(t *testing.T) { + vm := NewVM() + err := vm.Run("{'a': 1}.has('a')") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(1))) + } + + vm = NewVM() + err = vm.Run("{'a': 1}.has('b')") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(0))) + } + + vm = NewVM() + err = vm.Run("{'a': 1}.get('a')") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(1))) + } + + vm = NewVM() + err = vm.Run("{'a': 1}.get('b')") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, NewNullVal())) + } + + vm = NewVM() + err = vm.Run("{'a': 1}.get('b', 9)") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(9))) + } + + vm = NewVM() + err = vm.Run("a = &(1+2); {'a': &a}.get('a')") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(3))) + } + + vm = NewVM() + err = vm.Run("a = &(1+2); typeId({'a': &a}.getRaw('a'))") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(IntType(VMTypeComputedValue)))) + } + + vm = NewVM() + err = vm.Run("{'a': 1}.getRaw('b')") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, NewNullVal())) + } + + vm = NewVM() + err = vm.Run("{'__proto__': {'x': 1}}.has('x')") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(0))) + } +} + func TestReturn(t *testing.T) { vm := NewVM() err := vm.Run("func test(n) { return 1; 2 }; test(11)") @@ -940,6 +996,60 @@ func TestComputed2(t *testing.T) { } } +func TestComputedLiteral(t *testing.T) { + vm := NewVM() + err := vm.Run("a = &(1+2); typeId(&a)") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(IntType(VMTypeComputedValue)))) + } + + vm = NewVM() + err = vm.Run("a = &(1+2); a") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(3))) + } +} + +func TestComputedLiteralRoundTripByRepr(t *testing.T) { + vm := NewVM() + err := vm.Run("a = &(1+2); repr(loadRaw('a'))") + if assert.NoError(t, err) { + repr, ok := vm.Ret.ReadString() + if assert.True(t, ok) { + assert.Equal(t, "&(1+2)", repr) + + vm2 := NewVM() + err = vm2.Run("b = " + repr + "; typeId(&b)") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm2.Ret, ni(IntType(VMTypeComputedValue)))) + } + } + } +} + +func TestComputedMemberAccess(t *testing.T) { + vm := NewVM() + err := vm.Run("a = &(1+2); obj = {'a': &a, 'x': {'a': &a}}; arr = [&a]") + if !assert.NoError(t, err) { + return + } + + cases := []string{ + "a", + "obj.a", + `obj["a"]`, + "arr[0]", + "obj.x.a", + } + + for _, expr := range cases { + err = vm.Run(expr) + if assert.NoError(t, err, expr) { + assert.True(t, valueEqual(vm.Ret, ni(3)), expr) + } + } +} + func TestFunction(t *testing.T) { vm := NewVM() err := vm.Run("func a() { 123 }; a()") diff --git a/types.go b/types.go index e6285465..ce3b1b15 100644 --- a/types.go +++ b/types.go @@ -243,27 +243,33 @@ func (ctx *Context) loadInnerVar(name string) *VMValue { return builtinValues[name] } -func (ctx *Context) solveLoadPostAndComputed(name string, val *VMValue, isRaw bool, detail *BufferSpan) *VMValue { - withDetail := detail != nil +func (ctx *Context) solveComputedValue(val *VMValue, isRaw bool, detail *BufferSpan) *VMValue { + if val == nil { + return nil + } - // 计算真实结果 - doCompute := func(val *VMValue) *VMValue { - if !isRaw && val.TypeId == VMTypeComputedValue { - if withDetail { - val = val.ComputedExecute(ctx, detail) - } else { - val = val.ComputedExecute(ctx, &BufferSpan{}) - } - if ctx.Error != nil { - return nil - } - } + withDetail := detail != nil - // 追加计算结果到detail + if !isRaw && val.TypeId == VMTypeComputedValue { if withDetail { - detail.Ret = val + val = val.ComputedExecute(ctx, detail) + } else { + val = val.ComputedExecute(ctx, &BufferSpan{}) } - return val + if ctx.Error != nil { + return nil + } + } + + if withDetail { + detail.Ret = val + } + return val +} + +func (ctx *Context) solveLoadPostAndComputed(name string, val *VMValue, isRaw bool, detail *BufferSpan) *VMValue { + doCompute := func(val *VMValue) *VMValue { + return ctx.solveComputedValue(val, isRaw, detail) } if ctx.Config.HookValueLoadPost != nil { @@ -293,13 +299,7 @@ func (ctx *Context) LoadNameGlobalWithDetail(name string, isRaw bool, detail *Bu if loadFunc != nil { val := loadFunc(name) if val != nil { - if !isRaw && val.TypeId == VMTypeComputedValue { - val = val.ComputedExecute(ctx, detail) - if ctx.Error != nil { - return nil - } - } - return val + return ctx.solveComputedValue(val, isRaw, detail) } } // else { @@ -1100,8 +1100,8 @@ func (v *VMValue) AttrSet(ctx *Context, name string, val *VMValue) *VMValue { return nil } -// AttrGet 如果返回nil 说明不支持 . 取属性 -func (v *VMValue) AttrGet(ctx *Context, name string) *VMValue { +// attrGetRaw 按普通成员查找规则取值,但不自动展开 computed。 +func (v *VMValue) attrGetRaw(ctx *Context, name string, isRaw bool) *VMValue { switch v.TypeId { case VMTypeComputedValue: cd, _ := v.ReadComputed() @@ -1145,13 +1145,13 @@ func (v *VMValue) AttrGet(ctx *Context, name string) *VMValue { } case vmTypeGlobal: // 加载全局变量 - ret := ctx.LoadNameGlobal(name, false) + ret := ctx.LoadNameGlobal(name, isRaw) if ret == nil { ret = NewNullVal() } return ret case vmTypeLocal: - ret := ctx.LoadNameLocal(name, false) + ret := ctx.LoadNameLocal(name, isRaw) if ret == nil { ret = NewNullVal() } @@ -1181,7 +1181,12 @@ func (v *VMValue) AttrGet(ctx *Context, name string) *VMValue { return NewNullVal() } -func (v *VMValue) ItemGet(ctx *Context, index *VMValue) *VMValue { +// AttrGet 如果返回nil 说明不支持 . 取属性 +func (v *VMValue) AttrGet(ctx *Context, name string) *VMValue { + return ctx.solveComputedValue(v.attrGetRaw(ctx, name, false), false, nil) +} + +func (v *VMValue) itemGetRaw(ctx *Context, index *VMValue) *VMValue { switch v.TypeId { case VMTypeArray: if index.TypeId != VMTypeInt { @@ -1223,6 +1228,10 @@ func (v *VMValue) ItemGet(ctx *Context, index *VMValue) *VMValue { return nil } +func (v *VMValue) ItemGet(ctx *Context, index *VMValue) *VMValue { + return ctx.solveComputedValue(v.itemGetRaw(ctx, index), false, nil) +} + func (v *VMValue) ItemSet(ctx *Context, index *VMValue, val *VMValue) bool { switch v.TypeId { case VMTypeArray: diff --git a/types_methods.go b/types_methods.go index 0ce0776e..944ace7c 100644 --- a/types_methods.go +++ b/types_methods.go @@ -146,6 +146,54 @@ func funcDictLen(ctx *Context, this *VMValue, params []*VMValue) *VMValue { return NewIntVal(IntType(d.Dict.Length())) } +func funcDictHas(ctx *Context, this *VMValue, params []*VMValue) *VMValue { + d := this.MustReadDictData() + key, err := params[0].AsDictKey() + if err != nil { + ctx.Error = err + return nil + } + + _, ok := d.Dict.Load(key) + return boolToVMValue(ok) +} + +func funcDictGet(ctx *Context, this *VMValue, params []*VMValue) *VMValue { + d := this.MustReadDictData() + key, err := params[0].AsDictKey() + if err != nil { + ctx.Error = err + return nil + } + + val, ok := d.Dict.Load(key) + if ok { + return ctx.solveComputedValue(val, false, nil) + } + if len(params) > 1 { + return params[1] + } + return NewNullVal() +} + +func funcDictGetRaw(ctx *Context, this *VMValue, params []*VMValue) *VMValue { + d := this.MustReadDictData() + key, err := params[0].AsDictKey() + if err != nil { + ctx.Error = err + return nil + } + + val, ok := d.Dict.Load(key) + if ok { + return val + } + if len(params) > 1 { + return params[1] + } + return NewNullVal() +} + var builtinProto = map[VMValueType]*VMDictValue{ VMTypeComputedValue: NewDictValWithArrayMust( NewStrVal("compute"), nnf(&ndf{"Computed.compute", []string{}, nil, nil, nil}), @@ -167,6 +215,9 @@ var builtinProto = map[VMValueType]*VMDictValue{ NewStrVal("values"), nnf(&ndf{"Dict.values", []string{}, nil, nil, funcDictValues}), NewStrVal("items"), nnf(&ndf{"Dict.items", []string{}, nil, nil, funcDictItems}), NewStrVal("len"), nnf(&ndf{"Dict.len", []string{}, nil, nil, funcDictLen}), + NewStrVal("has"), nnf(&ndf{"Dict.has", []string{"key"}, nil, nil, funcDictHas}), + NewStrVal("get"), nnf(&ndf{"Dict.get", []string{"key", "default"}, []*VMValue{nil, NewNullVal()}, nil, nil}), + NewStrVal("getRaw"), nnf(&ndf{"Dict.getRaw", []string{"key", "default"}, []*VMValue{nil, NewNullVal()}, nil, funcDictGetRaw}), ), } @@ -201,4 +252,12 @@ func _init2() bool { return false } +func _init3() bool { + // 因循环引用问题无法在上面声明 + funcGet := nnf(&ndf{"Dict.get", []string{"key", "default"}, []*VMValue{nil, NewNullVal()}, nil, funcDictGet}) + builtinProto[VMTypeDict].Store("get", funcGet) + return false +} + var _ = _init2() +var _ = _init3() diff --git a/types_methods_test.go b/types_methods_test.go index 4b6e0839..88505523 100644 --- a/types_methods_test.go +++ b/types_methods_test.go @@ -66,3 +66,44 @@ func TestTypesMethodDictLen(t *testing.T) { v := funcDictLen(nil, d.V(), nil) assert.Equal(t, v.MustReadInt(), IntType(2)) } + +func TestTypesMethodDictHas(t *testing.T) { + vm := NewVM() + d := NewDictValWithArrayMust(ns("a"), ni(1), ns("b"), ni(2)) + + v := funcDictHas(vm, d.V(), []*VMValue{ns("a")}) + assert.True(t, valueEqual(v, ni(1))) + + v = funcDictHas(vm, d.V(), []*VMValue{ns("c")}) + assert.True(t, valueEqual(v, ni(0))) +} + +func TestTypesMethodDictGet(t *testing.T) { + vm := NewVM() + c := NewComputedValRaw(&ComputedData{Expr: "1 + 2"}) + d := NewDictValWithArrayMust(ns("a"), ni(1), ns("c"), c) + + v := funcDictGet(vm, d.V(), []*VMValue{ns("a"), ni(9)}) + assert.True(t, valueEqual(v, ni(1))) + + v = funcDictGet(vm, d.V(), []*VMValue{ns("c"), ni(9)}) + assert.True(t, valueEqual(v, ni(3))) + + v = funcDictGet(vm, d.V(), []*VMValue{ns("missing"), ni(9)}) + assert.True(t, valueEqual(v, ni(9))) +} + +func TestTypesMethodDictGetRaw(t *testing.T) { + vm := NewVM() + c := NewComputedValRaw(&ComputedData{Expr: "1 + 2"}) + d := NewDictValWithArrayMust(ns("a"), ni(1), ns("c"), c) + + v := funcDictGetRaw(vm, d.V(), []*VMValue{ns("a"), ni(9)}) + assert.True(t, valueEqual(v, ni(1))) + + v = funcDictGetRaw(vm, d.V(), []*VMValue{ns("c"), ni(9)}) + assert.Equal(t, VMTypeComputedValue, v.TypeId) + + v = funcDictGetRaw(vm, d.V(), []*VMValue{ns("missing"), ni(9)}) + assert.True(t, valueEqual(v, ni(9))) +} diff --git a/types_test.go b/types_test.go index 28f7bee8..3c9d9796 100644 --- a/types_test.go +++ b/types_test.go @@ -442,6 +442,23 @@ func TestNativeObject(t *testing.T) { assert.Equal(t, ret.ToString(), "['x']") } +func TestNativeObjectComputedRead(t *testing.T) { + vm := NewVM() + slot := NewComputedVal("1+2") + od := &NativeObjectData{ + Name: "obj1", + AttrGet: func(ctx *Context, name string) *VMValue { + return slot + }, + ItemGet: func(ctx *Context, index *VMValue) *VMValue { + return slot + }, + } + v := NewNativeObjectVal(od) + assert.True(t, valueEqual(v.AttrGet(vm, "a"), ni(3))) + assert.True(t, valueEqual(v.ItemGet(vm, ni(0)), ni(3))) +} + func TestAsBool(t *testing.T) { assert.Equal(t, ni(1).AsBool(), true) assert.Equal(t, ni(0).AsBool(), false)