(cl:in-package #:sod-parser)
;;;--------------------------------------------------------------------------
-;;; Basic protocol implementation.
+;;; Basic protocol.
(defclass expression-parse-state ()
((opstack :initform nil :type list)
(:documentation
"State for the expression parser. Largely passive."))
-(defmethod push-value (value (state expression-parse-state))
- (with-slots (valstack) state
- (push value valstack)))
+(defgeneric push-operator (operator state)
+ (:documentation
+ "Push an OPERATOR onto the STATE's operator stack.
+
+ This should apply existing stacked operators as necessary to obey the
+ language's precedence rules."))
+
+(defgeneric apply-operator (operator state)
+ (:documentation
+ "Apply the OPERATOR to arguments on the STATE's value stack.
+
+ This should pop any necessary arguments, and push the result."))
(defmethod push-operator (operator (state expression-parse-state))
(with-slots (opstack) state
(push-operator value state)))
(multiple-value-bind (value winp) (parse p-operand)
(unless winp (fail value))
- (push-value value state))
+ (push value (slot-value state 'valstack)))
(loop (multiple-value-bind (value winp) (parse p-postop)
(unless winp (return))
(push-operator value state)))))