diff --git a/roll.peg b/roll.peg index 5bacdff7..0150828f 100644 --- a/roll.peg +++ b/roll.peg @@ -212,10 +212,10 @@ exprExp <- exprUnaryNeg ( )* // 正数 负数 -exprUnaryNeg <- minus exprRoot { c.data.AddOp(typeNegation) } +exprUnaryNeg <- minus exprDice { c.data.AddOp(typeNegation) } / exprUnaryPos -exprUnaryPos <- add exprRoot { c.data.AddOp(typePositive) } +exprUnaryPos <- add exprDice { c.data.AddOp(typePositive) } / exprDice // 骰子算符 diff --git a/roll.peg.go b/roll.peg.go index 62a62ca4..83e14514 100644 --- a/roll.peg.go +++ b/roll.peg.go @@ -1331,7 +1331,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 102 /* minus */}, - &ruleIRefExpr{index: 26 /* exprRoot */}, + &ruleIRefExpr{index: 68 /* exprDice */}, }, }, }, @@ -1348,7 +1348,7 @@ var g = &grammar{ expr: &seqExpr{ exprs: []any{ &ruleIRefExpr{index: 101 /* add */}, - &ruleIRefExpr{index: 26 /* exprRoot */}, + &ruleIRefExpr{index: 68 /* exprDice */}, }, }, }, diff --git a/rollvm_test.go b/rollvm_test.go index d8db94c6..f00019b5 100644 --- a/rollvm_test.go +++ b/rollvm_test.go @@ -1,7 +1,6 @@ package dicescript import ( - "fmt" "regexp" "strconv" "strings" @@ -460,22 +459,26 @@ func TestUnary(t *testing.T) { } vm = NewVM() - err = vm.Run("--1") + err = vm.Run("- 1") if assert.NoError(t, err) { - assert.True(t, valueEqual(vm.Ret, ni(1))) + assert.True(t, valueEqual(vm.Ret, ni(-1))) } + vm = NewVM() + err = vm.Run("--1") + assert.Error(t, err) + + vm = NewVM() + err = vm.Run("++1") + assert.Error(t, err) + vm = NewVM() err = vm.Run("-+1") - if assert.NoError(t, err) { - assert.True(t, valueEqual(vm.Ret, ni(-1))) - } + assert.Error(t, err) vm = NewVM() err = vm.Run("+-1") - if assert.NoError(t, err) { - assert.True(t, valueEqual(vm.Ret, ni(-1))) - } + assert.Error(t, err) vm = NewVM() err = vm.Run("-1.3") @@ -1579,7 +1582,6 @@ func TestIfError(t *testing.T) { vm := NewVM() var err error err = vm.Run("if 1 ") - fmt.Println(err) assert.Contains(t, err.Error(), "不符合if语法") } @@ -1600,3 +1602,21 @@ func TestFStringV1IfCompatible(t *testing.T) { assert.Equal(t, vm.V1IfCompatibleCount, 1) } } + +func TestNeg(t *testing.T) { + vm := NewVM() + var err error + err = vm.Run("-1 + 5") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(4))) + } +} + +func TestNeg2(t *testing.T) { + vm := NewVM() + var err error + err = vm.Run("-1-5") + if assert.NoError(t, err) { + assert.True(t, valueEqual(vm.Ret, ni(-6))) + } +} diff --git a/types.go b/types.go index a9c4bb4e..88da034e 100644 --- a/types.go +++ b/types.go @@ -130,7 +130,7 @@ type Context struct { parser *parser subThreadDepth int attrs *ValueMap - upCtx *Context + UpCtx *Context // subThread *Context // 用于执行子句 code []ByteCode @@ -300,10 +300,10 @@ func (ctx *Context) LoadName(name string, isRaw bool, useHook bool) *VMValue { if ret.TypeId != VMTypeNull { return ret } - if curCtx.upCtx == nil { + if curCtx.UpCtx == nil { break } else { - curCtx = curCtx.upCtx + curCtx = curCtx.UpCtx } } @@ -1393,7 +1393,7 @@ func (v *VMValue) ComputedExecute(ctx *Context) *VMValue { vm.GlobalValueLoadFunc = ctx.GlobalValueLoadFunc vm.GlobalValueLoadOverwriteFunc = ctx.GlobalValueLoadOverwriteFunc vm.subThreadDepth = ctx.subThreadDepth + 1 - vm.upCtx = ctx + vm.UpCtx = ctx vm.NumOpCount = ctx.NumOpCount + 100 ctx.NumOpCount = vm.NumOpCount // 防止无限递归 vm.randSrc = ctx.randSrc @@ -1454,7 +1454,7 @@ func (v *VMValue) FuncInvoke(ctx *Context, params []*VMValue) *VMValue { vm.GlobalValueLoadFunc = ctx.GlobalValueLoadFunc vm.GlobalValueLoadOverwriteFunc = ctx.GlobalValueLoadOverwriteFunc vm.subThreadDepth = ctx.subThreadDepth + 1 - vm.upCtx = ctx + vm.UpCtx = ctx vm.NumOpCount = ctx.NumOpCount + 100 // 递归视为消耗 + 100 ctx.NumOpCount = vm.NumOpCount // 防止无限递归 vm.randSrc = ctx.randSrc