blob: 1a921a0839e81cf1846429ee54db96555adfff86 (
plain) (
tree)
|
|
(defpackage #:cabs-syn
(:use #:common-lisp)
(:export
#:<exp-int>
#:<exp-var>
#:<exp-str>
#:<exp-unr>
#:<exp-bin>
#:<cmd-rem>
#:<cmd-goto>
#:<cmd-print>
#:<cmd-input>
#:<cmd-if>
#:<cmd-let>
#:<phrase-line>
#:<phrase-list>
#:<phrase-run>
#:<phrase-p-end>
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.
;; Is it worth putting just 3 lines in a "cutils.lisp" or something?
;; Not for now, since it's private.
(defclass <abstract-class> () ())
(defmethod make-instance ((self <abstract-class>) &key)
(error "Cannot instantiate abstract class ~A" (class-name c)))
(defclass <expression> () () (:metaclass <abstract-class>))
(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> () () (:metaclass <abstract-class>))
(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> () () (:metaclass <abstract-class>))
(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)))
(provide "cabs-syn")
|