diff options
Diffstat (limited to 'cpprint.lisp')
-rw-r--r-- | cpprint.lisp | 82 |
1 files changed, 44 insertions, 38 deletions
diff --git a/cpprint.lisp b/cpprint.lisp index 84dbfc1..82dec08 100644 --- a/cpprint.lisp +++ b/cpprint.lisp @@ -1,3 +1,8 @@ +(defpackage #:cpprint + (:use #:common-lisp) + (:export pp-line)) +(in-package #:cpprint) + (defun pp-binop (bin-op) (case bin-op ((plus) "+") @@ -15,69 +20,70 @@ ((or) " | "))) (defun pp-unrop (unr-op) - (case unr-op - ((uminus) "-") - ((not) "!"))) + (case unr-op + ((uminus) "-") + ((not) "!"))) (defun parenthesis (x) - (string-append "(" x ")")) + (string-append "(" x ")")) (defgeneric ppl (pr expr)) (defmethod ppl (pr (expr <exp-int>)) - (convert (num expr) <string>)) + (convert (num expr) <string>)) (defmethod ppl (pr (expr <exp-var>)) - (var expr)) + (var expr)) (defmethod ppl (pr (expr <exp-str>)) - (string-append "\"" (str expr) "\"")) + (string-append "\"" (str expr) "\"")) (defmethod ppl (pr (expr <exp-unr>)) - (let* ((op (op expr)) - (res-op (pp-unrop op)) - (pr2 (priority-uop op)) - (res-e (ppl pr2 (expr expr)))) - (if (= pr 0) - (parenthesis (string-append res-op res-e)) - (string-append res-op res-e)))) + (let* ((op (op expr)) + (res-op (pp-unrop op)) + (pr2 (priority-uop op)) + (res-e (ppl pr2 (expr expr)))) + (if (= pr 0) + (parenthesis (string-append res-op res-e)) + (string-append res-op res-e)))) (defmethod ppl (pr (expr <exp-bin>)) - (let* ((op (op expr)) - (pr2 (priority-binop op)) - (res (string-append (ppl pr2 (expr1 expr)) (pp-binop op) (ppr pr2 (expr2 expr))))) - (if (>= pr2 pr) - res - (parenthesis res)))) + (let* ((op (op expr)) + (pr2 (priority-binop op)) + (res (string-append (ppl pr2 (expr1 expr)) (pp-binop op) (ppr pr2 (expr2 expr))))) + (if (>= pr2 pr) + res + (parenthesis res)))) (defgeneric ppr (pr expr)) (defmethod ppr (pr (expr <exp-bin>)) - (let* ((op (op expr)) - (pr2 (priority-binop op)) - (res (string-append (ppl pr2 (expr1 expr)) (pp-binop op) (ppr pr2 (expr2 expr))))) - (if (> pr2 pr) - res - (parenthesis res)))) + (let* ((op (op expr)) + (pr2 (priority-binop op)) + (res (string-append (ppl pr2 (expr1 expr)) (pp-binop op) (ppr pr2 (expr2 expr))))) + (if (> pr2 pr) + res + (parenthesis res)))) (defmethod ppr (pr (expr <exp-int>)) - (ppl pr expr)) + (ppl pr expr)) (defmethod ppr (pr (expr <exp-var>)) - (ppl pr expr)) + (ppl pr expr)) (defmethod ppr (pr (expr <exp-str>)) - (ppl pr expr)) + (ppl pr expr)) (defmethod ppr (pr (expr <exp-unr>)) - (ppl pr expr)) + (ppl pr expr)) (defun pp-expression (expr) - (ppl 0 expr)) + (ppl 0 expr)) (defgeneric pp-command (cmd)) (defmethod pp-command ((cmd <cmd-rem>)) - (string-append "REM " (str cmd))) + (string-append "REM " (str cmd))) (defmethod pp-command ((cmd <cmd-goto>)) - (string-append "GOTO " (convert (num cmd) <string>))) + (string-append "GOTO " (convert (num cmd) <string>))) (defmethod pp-command ((cmd <cmd-print>)) - (string-append "PRNT " (pp-expression (expr cmd)))) + (string-append "PRINT " (pp-expression (expr cmd)))) (defmethod pp-command ((cmd <cmd-input>)) - (string-append "INPUT " (var cmd))) + (string-append "INPUT " (var cmd))) (defmethod pp-command ((cmd <cmd-if>)) - (string-append "IF " (pp-expression (expr cmd)) " THEN " (convert (num cmd) <string>))) + (string-append "IF " (pp-expression (expr cmd)) " THEN " (convert (num cmd) <string>))) (defmethod pp-command ((cmd <cmd-let>)) - (string-append "LET " (var cmd) " = " (pp-expression (expr cmd)))) + (string-append "LET " (var cmd) " = " (pp-expression (expr cmd)))) (defun pp-line (l) - (string-append (convert (car l) <string>) " " (pp-command (cdr l)))) + (string-append (convert (car l) <string>) " " (pp-command (cdr l)))) +(provide "cpprint") |