about summary refs log tree commit diff stats
path: root/cabs-syn.lisp
diff options
context:
space:
mode:
authorDarren Bane <darren.bane@emdalo.com>2020-08-04 12:30:56 +0100
committerDarren Bane <darren.bane@emdalo.com>2020-08-04 12:30:56 +0100
commit1167e1207e3c0928f04aa3ed51fc315fb5b8729a (patch)
treeaa7d0bb009a5495f4ba524cfcbd4e36704c0d9eb /cabs-syn.lisp
parent546c54613a397996e3faa04173bfa73a08a6ee47 (diff)
downloadlsp-1167e1207e3c0928f04aa3ed51fc315fb5b8729a.tar.gz
Flip-flop back to CL.
Diffstat (limited to 'cabs-syn.lisp')
-rw-r--r--cabs-syn.lisp37
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)))