(defpackage #:parsing (:use #:openlisp #:lex #:abs-syn) (:export #:parse)) (in-package #:parsing) (defclass () () (:abstractp t)) (defclass () ((expr :accessor expr))) (defclass () ((bin-op :accessor bin-op))) (defclass () ((unr-op :accessor unr-op))) (defclass () ()) (defun unr-symb (s) (cond ((string= s "!") 'not) ((string= s "-") 'uminus) (t (error "Parse error")))) (defun bin-symb (s) (cond ((string= s "+") 'plus) ((string= s "-") 'minus) ((string= s "*") 'mult) ((string= s "/") 'div) ((string= s "%") 'mod) ((string= s "=") 'equal) ((string= s "<") 'less) ((string= s "<=") 'lesseq) ((string= s ">") 'great))) (defun parse (str) (let* ((cl (init-lex str)) (tok (lexer cl))) (cond ((instancep tok (class )) (create (class ) 'n n 'c (parse-cmd cl))) ((instancep tok (class )) (cond ((string= (ident tok) "LIST") (create (class ))) ((string= (ident tok) "RUN") (create (class ))) ((string= (ident tok) "END") (create (class ))) (t (error "Parse error")))) (t (error "Parse error"))))) (provide "parsing")