diff options
author | Darren Bane <darren.bane@emdalo.com> | 2020-08-04 12:30:56 +0100 |
---|---|---|
committer | Darren Bane <darren.bane@emdalo.com> | 2020-08-04 12:30:56 +0100 |
commit | 1167e1207e3c0928f04aa3ed51fc315fb5b8729a (patch) | |
tree | aa7d0bb009a5495f4ba524cfcbd4e36704c0d9eb /cabs-syn.lisp | |
parent | 546c54613a397996e3faa04173bfa73a08a6ee47 (diff) | |
download | lsp-1167e1207e3c0928f04aa3ed51fc315fb5b8729a.tar.gz |
Flip-flop back to CL.
Diffstat (limited to 'cabs-syn.lisp')
-rw-r--r-- | cabs-syn.lisp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/cabs-syn.lisp b/cabs-syn.lisp new file mode 100644 index 0000000..a339a47 --- /dev/null +++ b/cabs-syn.lisp @@ -0,0 +1,37 @@ +;; 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 <expression> () () (:abstractp t)) +(defclass <exp-int> (<expression>) ((int :accessor int))) +(defclass <exp-var> (<expression>) ((var :accessor var))) +(defclass <exp-str> (<expression>) ((str :accessor str))) +(defclass <exp-unr> (<expression>) ((op :accessor op) (exp :accessor exp))) +(defclass <exp-bin> (<expression>) ((exp1 :accessor exp1) (op :accessor op) (exp2 :accessor exp2))) + +(defclass <command> () () (:abstractp t)) +(defclass <cmd-rem> (<command>) ((rem :accessor rem))) +(defclass <cmd-goto> (<command>) ((goto :accessor goto))) +(defclass <cmd-print> (<command>) ((expr :accessor expr))) +(defclass <cmd-input> (<command>) ((var :accessor var))) +(defclass <cmd-if> (<command>) ((expr :accessor expr) (num :accessor num))) +(defclass <cmd-let> (<command>) ((var :accessor var) (expr :accessor expr))) + +(defclass <line> () ((num :accessor num) (cmd :accessor cmd))) + +(defclass <phrase> () () (:abstractp t)) +(defclass <phrase-line> (<phrase>) ((line :accessor line))) +(defclass <phrase-list> (<phrase>) ()) +(defclass <phrase-run> (<phrase>) ()) +(defclass <phrase-p-end> (<phrase>) ()) + +(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))) |