diff options
author | Darren Bane <darren.bane@gmail.com> | 2020-11-18 23:59:17 +0000 |
---|---|---|
committer | Darren Bane <darren.bane@gmail.com> | 2020-11-18 23:59:17 +0000 |
commit | 6e7cdcd4280f5330229ec9c943b9caf090846452 (patch) | |
tree | 7e7542c9edb9ef9805022ca105f42a56372aad9b /parse.lsp | |
parent | f1dd340e2def134d0641ebbbf92934f69086b643 (diff) | |
download | lsp-6e7cdcd4280f5330229ec9c943b9caf090846452.tar.gz |
Checkpointing from my Mac
Diffstat (limited to 'parse.lsp')
-rw-r--r-- | parse.lsp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/parse.lsp b/parse.lsp new file mode 100644 index 0000000..9bedee3 --- /dev/null +++ b/parse.lsp @@ -0,0 +1,43 @@ +(defpackage #:parse + (:use #:openlisp #:lex #:abs-syn) + (:export + #:parse)) +(in-package #:parse) + +(defclass <exp-elem> () () (:abstractp t)) +(defclass <elem-exp> (<exp-elem>) ((expr :accessor expr))) +(defclass <elem-bin> (<exp-elem>) ((bin-op :accessor bin-op))) +(defclass <elem-unr> (<exp-elem>) ((unr-op :accessor unr-op))) +(defclass <elem-lp> (<exp-elem) ()) + +(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 <lint>)) + (make-instance (class <line>) 'n n 'c (parse-cmd cl))) + ((instancep tok (class <lident>)) + (cond ((string= (ident tok) "LIST") + (create (class <phrase-list>))) + ((string= (ident tok) "RUN") + (create (class <phrase-run>))) + ((string= (ident tok) "END") + (create (class <phrase-p-end>))) + (t (error "Parse error")))) + (t (error "Parse error"))))) +(provide "parse") |