@@ -42,7 +42,9 @@ func Parse(infix string) (Evaluatable, error) {
4242 isOp (operators .Peek ()) &&
4343 ((ASSOC [token ] == "left" && PREC [token ] <= PREC [operators .Peek ()]) ||
4444 (ASSOC [token ] == "right" && PREC [token ] < PREC [operators .Peek ()])) {
45- pushExpr (operators .Pop (), expressions )
45+ if err := pushExpr (infix , operators .Pop (), expressions ); err != nil {
46+ return nil , err
47+ }
4648 }
4749 operators .Push (token )
4850 expectedTokenType = OPERAND
@@ -57,7 +59,9 @@ func Parse(infix string) (Evaluatable, error) {
5759 return nil , err
5860 }
5961 for operators .Len () > 0 && operators .Peek () != "(" {
60- pushExpr (operators .Pop (), expressions )
62+ if err := pushExpr (infix , operators .Pop (), expressions ); err != nil {
63+ return nil , err
64+ }
6165 }
6266 if operators .Len () == 0 {
6367 return nil , fmt .Errorf ("Tag expression \" %s\" could not be parsed because of syntax error: Unmatched )." , infix )
@@ -70,7 +74,9 @@ func Parse(infix string) (Evaluatable, error) {
7074 if err := check (infix , expectedTokenType , OPERAND ); err != nil {
7175 return nil , err
7276 }
73- pushExpr (token , expressions )
77+ if err := pushExpr (infix , token , expressions ); err != nil {
78+ return nil , err
79+ }
7480 expectedTokenType = OPERATOR
7581 }
7682 }
@@ -79,7 +85,9 @@ func Parse(infix string) (Evaluatable, error) {
7985 if operators .Peek () == "(" {
8086 return nil , fmt .Errorf ("Tag expression \" %s\" could not be parsed because of syntax error: Unmatched (." , infix )
8187 }
82- pushExpr (operators .Pop (), expressions )
88+ if err := pushExpr (infix , operators .Pop (), expressions ); err != nil {
89+ return nil , err
90+ }
8391 }
8492
8593 return expressions .Pop (), nil
@@ -153,24 +161,51 @@ func check(infix, expectedTokenType, tokenType string) error {
153161 return nil
154162}
155163
156- func pushExpr (token string , stack * EvaluatableStack ) {
164+ func pushExpr (infix string , token string , stack * EvaluatableStack ) error {
157165 if token == "and" {
158- rightAndExpr := stack .Pop ()
166+ rightAndExpr , err := popOperand (infix , stack )
167+ if err != nil {
168+ return err
169+ }
170+ leftAndExpr , err := popOperand (infix , stack )
171+ if err != nil {
172+ return err
173+ }
159174 stack .Push (& andExpr {
160- leftExpr : stack . Pop () ,
175+ leftExpr : leftAndExpr ,
161176 rightExpr : rightAndExpr ,
162177 })
163178 } else if token == "or" {
164- rightOrExpr := stack .Pop ()
179+ rightOrExpr , err := popOperand (infix , stack )
180+ if err != nil {
181+ return err
182+ }
183+ leftOrExpr , err := popOperand (infix , stack )
184+ if err != nil {
185+ return err
186+ }
165187 stack .Push (& orExpr {
166- leftExpr : stack . Pop () ,
188+ leftExpr : leftOrExpr ,
167189 rightExpr : rightOrExpr ,
168190 })
169191 } else if token == "not" {
170- stack .Push (& notExpr {expr : stack .Pop ()})
192+ expr , err := popOperand (infix , stack )
193+ if err != nil {
194+ return err
195+ }
196+ stack .Push (& notExpr {expr : expr })
171197 } else {
172198 stack .Push (& literalExpr {value : token })
173199 }
200+
201+ return nil
202+ }
203+
204+ func popOperand (infix string , stack * EvaluatableStack ) (Evaluatable , error ) {
205+ if stack .Len () > 0 {
206+ return stack .Pop (), nil
207+ }
208+ return nil , fmt .Errorf ("Tag expression \" %s\" could not be parsed because of syntax error: Expected operand." , infix )
174209}
175210
176211type literalExpr struct {
0 commit comments