@@ -33,8 +33,12 @@ func (e *Expression) Evaluate(values map[Variable]*Term, symbols *SymbolTable) (
33
33
return nil , fmt .Errorf ("datalog: expressions: unknown variable %d" , id .(Variable ))
34
34
}
35
35
id = * idptr
36
+ default : // do nothing
37
+ }
38
+ err := s .Push (id )
39
+ if err != nil {
40
+ return nil , fmt .Errorf ("datalog: expressions: stack overflow" )
36
41
}
37
- s .Push (id )
38
42
case OpTypeUnary :
39
43
v , err := s .Pop ()
40
44
if err != nil {
@@ -45,7 +49,10 @@ func (e *Expression) Evaluate(values map[Variable]*Term, symbols *SymbolTable) (
45
49
if err != nil {
46
50
return nil , fmt .Errorf ("datalog: expressions: unary eval failed: %w" , err )
47
51
}
48
- s .Push (res )
52
+ err = s .Push (res )
53
+ if err != nil {
54
+ return nil , fmt .Errorf ("datalog: expressions: stack overflow" )
55
+ }
49
56
case OpTypeBinary :
50
57
right , err := s .Pop ()
51
58
if err != nil {
@@ -60,7 +67,10 @@ func (e *Expression) Evaluate(values map[Variable]*Term, symbols *SymbolTable) (
60
67
if err != nil {
61
68
return nil , fmt .Errorf ("datalog: expressions: binary eval failed: %w" , err )
62
69
}
63
- s .Push (res )
70
+ err = s .Push (res )
71
+ if err != nil {
72
+ return nil , fmt .Errorf ("datalog: expressions: stack overflow" )
73
+ }
64
74
default :
65
75
return nil , fmt .Errorf ("datalog: expressions: unsupported Op: %v" , op .Type ())
66
76
}
@@ -83,22 +93,31 @@ func (e *Expression) Print(symbols *SymbolTable) string {
83
93
id := op .(Value ).ID
84
94
switch id .Type () {
85
95
case TermTypeString :
86
- s .Push (fmt .Sprintf ("\" %s\" " , symbols .Str (id .(String ))))
96
+ err := s .Push (fmt .Sprintf ("\" %s\" " , symbols .Str (id .(String ))))
97
+ if err != nil {
98
+ return "<invalid expression: stack overflow>"
99
+ }
87
100
case TermTypeVariable :
88
- s .Push (fmt .Sprintf ("$%s" , symbols .Var (id .(Variable ))))
101
+ err := s .Push (fmt .Sprintf ("$%s" , symbols .Var (id .(Variable ))))
102
+ if err != nil {
103
+ return "<invalid expression: stack overflow>"
104
+ }
89
105
default :
90
- s .Push (id .String ())
106
+ err := s .Push (id .String ())
107
+ if err != nil {
108
+ return "<invalid expression: stack overflow>"
109
+ }
91
110
}
92
111
case OpTypeUnary :
93
112
v , err := s .Pop ()
94
113
if err != nil {
95
114
return "<invalid expression: unary operation failed to pop value>"
96
115
}
97
116
res := op .(UnaryOp ).Print (v )
117
+ err = s .Push (res )
98
118
if err != nil {
99
- return "<invalid expression: binary operation failed to pop right value >"
119
+ return "<invalid expression: stack overflow >"
100
120
}
101
- s .Push (res )
102
121
case OpTypeBinary :
103
122
right , err := s .Pop ()
104
123
if err != nil {
@@ -109,7 +128,10 @@ func (e *Expression) Print(symbols *SymbolTable) string {
109
128
return "<invalid expression: binary operation failed to pop left value>"
110
129
}
111
130
res := op .(BinaryOp ).Print (left , right )
112
- s .Push (res )
131
+ err = s .Push (res )
132
+ if err != nil {
133
+ return "<invalid expression: stack overflow>"
134
+ }
113
135
default :
114
136
return fmt .Sprintf ("<invalid expression: unsupported op type %v>" , op .Type ())
115
137
}
@@ -160,6 +182,8 @@ func (op UnaryOp) Print(value string) string {
160
182
out = fmt .Sprintf ("!%s" , value )
161
183
case UnaryParens :
162
184
out = fmt .Sprintf ("(%s)" , value )
185
+ case UnaryLength :
186
+ out = fmt .Sprintf ("%s.length()" , value )
163
187
default :
164
188
out = fmt .Sprintf ("unknown(%s)" , value )
165
189
}
@@ -186,7 +210,7 @@ type Negate struct{}
186
210
func (Negate ) Type () UnaryOpType {
187
211
return UnaryNegate
188
212
}
189
- func (Negate ) Eval (value Term , symbols * SymbolTable ) (Term , error ) {
213
+ func (Negate ) Eval (value Term , _ * SymbolTable ) (Term , error ) {
190
214
var out Term
191
215
switch value .Type () {
192
216
case TermTypeBool :
@@ -206,7 +230,7 @@ type Parens struct{}
206
230
func (Parens ) Type () UnaryOpType {
207
231
return UnaryParens
208
232
}
209
- func (Parens ) Eval (value Term , symbols * SymbolTable ) (Term , error ) {
233
+ func (Parens ) Eval (value Term , _ * SymbolTable ) (Term , error ) {
210
234
return value , nil
211
235
}
212
236
@@ -228,7 +252,7 @@ func (Length) Eval(value Term, symbols *SymbolTable) (Term, error) {
228
252
case TermTypeSet :
229
253
out = Integer (len (value .(Set )))
230
254
default :
231
- return nil , fmt .Errorf ("datalog: unexpected Negate value type: %d" , value .Type ())
255
+ return nil , fmt .Errorf ("datalog: unexpected Length value type: %d" , value .Type ())
232
256
}
233
257
return out , nil
234
258
}
@@ -318,7 +342,7 @@ type LessThan struct{}
318
342
func (LessThan ) Type () BinaryOpType {
319
343
return BinaryLessThan
320
344
}
321
- func (LessThan ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
345
+ func (LessThan ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
322
346
if g , w := left .Type (), right .Type (); g != w {
323
347
return nil , fmt .Errorf ("datalog: LessThan type mismatch: %d != %d" , g , w )
324
348
}
@@ -344,7 +368,7 @@ type LessOrEqual struct{}
344
368
func (LessOrEqual ) Type () BinaryOpType {
345
369
return BinaryLessOrEqual
346
370
}
347
- func (LessOrEqual ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
371
+ func (LessOrEqual ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
348
372
if g , w := left .Type (), right .Type (); g != w {
349
373
return nil , fmt .Errorf ("datalog: LessOrEqual type mismatch: %d != %d" , g , w )
350
374
}
@@ -370,7 +394,7 @@ type GreaterThan struct{}
370
394
func (GreaterThan ) Type () BinaryOpType {
371
395
return BinaryGreaterThan
372
396
}
373
- func (GreaterThan ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
397
+ func (GreaterThan ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
374
398
if g , w := left .Type (), right .Type (); g != w {
375
399
return nil , fmt .Errorf ("datalog: GreaterThan type mismatch: %d != %d" , g , w )
376
400
}
@@ -396,7 +420,7 @@ type GreaterOrEqual struct{}
396
420
func (GreaterOrEqual ) Type () BinaryOpType {
397
421
return BinaryGreaterOrEqual
398
422
}
399
- func (GreaterOrEqual ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
423
+ func (GreaterOrEqual ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
400
424
if g , w := left .Type (), right .Type (); g != w {
401
425
return nil , fmt .Errorf ("datalog: GreaterOrEqual type mismatch: %d != %d" , g , w )
402
426
}
@@ -422,7 +446,7 @@ type Equal struct{}
422
446
func (Equal ) Type () BinaryOpType {
423
447
return BinaryEqual
424
448
}
425
- func (Equal ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
449
+ func (Equal ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
426
450
if g , w := left .Type (), right .Type (); g != w {
427
451
return nil , fmt .Errorf ("datalog: Equal type mismatch: %d != %d" , g , w )
428
452
}
@@ -510,7 +534,7 @@ type Intersection struct{}
510
534
func (Intersection ) Type () BinaryOpType {
511
535
return BinaryIntersection
512
536
}
513
- func (Intersection ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
537
+ func (Intersection ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
514
538
set , ok := left .(Set )
515
539
if ! ok {
516
540
return nil , errors .New ("datalog: Intersection left value must be a Set" )
@@ -530,7 +554,7 @@ type Union struct{}
530
554
func (Union ) Type () BinaryOpType {
531
555
return BinaryUnion
532
556
}
533
- func (Union ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
557
+ func (Union ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
534
558
set , ok := left .(Set )
535
559
if ! ok {
536
560
return nil , errors .New ("datalog: Union left value must be a Set" )
@@ -654,7 +678,7 @@ type Sub struct{}
654
678
func (Sub ) Type () BinaryOpType {
655
679
return BinarySub
656
680
}
657
- func (Sub ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
681
+ func (Sub ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
658
682
ileft , ok := left .(Integer )
659
683
if ! ok {
660
684
return nil , fmt .Errorf ("datalog: Sub requires left value to be an Integer, got %T" , left )
@@ -682,7 +706,7 @@ type Mul struct{}
682
706
func (Mul ) Type () BinaryOpType {
683
707
return BinaryMul
684
708
}
685
- func (Mul ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
709
+ func (Mul ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
686
710
ileft , ok := left .(Integer )
687
711
if ! ok {
688
712
return nil , fmt .Errorf ("datalog: Mul requires left value to be an Integer, got %T" , left )
@@ -711,7 +735,7 @@ type Div struct{}
711
735
func (Div ) Type () BinaryOpType {
712
736
return BinaryDiv
713
737
}
714
- func (Div ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
738
+ func (Div ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
715
739
ileft , ok := left .(Integer )
716
740
if ! ok {
717
741
return nil , fmt .Errorf ("datalog: Div requires left value to be an Integer, got %T" , left )
@@ -735,7 +759,7 @@ type And struct{}
735
759
func (And ) Type () BinaryOpType {
736
760
return BinaryAnd
737
761
}
738
- func (And ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
762
+ func (And ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
739
763
bleft , ok := left .(Bool )
740
764
if ! ok {
741
765
return nil , fmt .Errorf ("datalog: And requires left value to be a Bool, got %T" , left )
@@ -755,7 +779,7 @@ type Or struct{}
755
779
func (Or ) Type () BinaryOpType {
756
780
return BinaryOr
757
781
}
758
- func (Or ) Eval (left Term , right Term , symbols * SymbolTable ) (Term , error ) {
782
+ func (Or ) Eval (left Term , right Term , _ * SymbolTable ) (Term , error ) {
759
783
bleft , ok := left .(Bool )
760
784
if ! ok {
761
785
return nil , fmt .Errorf ("datalog: Or requires left value to be a Bool, got %T" , left )
0 commit comments