(defpackage #:cabs-syn (:use #:common-lisp #:cutil) (:export #: #: #: #: #: #: #: #: #: #: #: #: #: #: #: #:priority-uop #:priority-binop)) (in-package #:cabs-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 () () (:metaclass )) (defclass () ((my-int :accessor my-int))) ;; TODO: need another closer-mop:validate-superclass call here (defclass () ((var :accessor var))) (defclass () ((str :accessor str))) (defclass () ((op :accessor op) (expr :accessor expr))) (defclass () ((exp1 :accessor exp1) (op :accessor op) (exp2 :accessor exp2))) (defclass () () (:metaclass )) (defclass () ((remark :accessor remark))) (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 :initarg n :accessor num) (cmd :initarg c :accessor cmd))) (defclass () () (:metaclass )) (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 "cabs-syn")