(defpackage #:abs-syn (:use #:openlisp) (:export #: #: #: #: #: #: #: #: #: #: #: #: #: #: #: #:priority-uop #:priority-binop)) (in-package #:abs-syn) ;; If these were only C enums, without any payload, I'd just use symbols and (error) in the t case. ;; But classes seem better for the associated data, in discriminated unions. (defclass () () (:abstractp t)) (defclass () ((int :accessor int))) (defclass () ((var :accessor var))) (defclass () ((str :accessor str))) (defclass () ((op :accessor op) (exp :accessor exp))) (defclass () ((exp1 :accessor exp1) (op :accessor op) (exp2 :accessor exp2))) (defclass () () (:abstractp t)) (defclass () ((rem :accessor rem))) (defclass () ((goto :accessor goto))) (defclass () ((expr :accessor expr))) (defclass () ((var :accessor var))) (defclass () ((expr :accessor expr) (num :accessor num))) (defclass () ((var :accessor var) (expr :accessor expr))) (defclass () ((num :accessor num) (cmd :accessor cmd))) (defclass () () (:abstractp t)) (defclass () ((line :accessor line))) (defclass () ()) (defclass () ()) (defclass () ()) (defun priority-uop (unr-op) (case unr-op ((not) 1) ((uminus) 7))) (defun priority-binop (bin-op) (cond ((member bin-op '(mult div)) 6) ((member bin-op '(plus minus)) 5) ((eql bin-op 'mod) 4) ((member bin-op '(equal less lesseq great greateq diff)) 3) ((member bin-op '(and or)) 2))) (provide "abs-syn")