diff options
author | Darren Bane <dbane@tilde.institute> | 2020-12-11 14:14:33 +0000 |
---|---|---|
committer | Darren Bane <dbane@tilde.institute> | 2020-12-11 14:14:33 +0000 |
commit | 207cda23007f05dd954ee82511babba457465265 (patch) | |
tree | 44c143f1554b83d31eaac374a738b7fbaaba459d /parsing.lsp | |
parent | 76105d297c5b56cf097bcf129e6de56d681744cc (diff) | |
parent | f16f553f2effb7ac8120fb8a15b59bcdd480a97d (diff) | |
download | lsp-207cda23007f05dd954ee82511babba457465265.tar.gz |
Merge branch 'master' of /home/dbane/public_repos/lsp into master
Diffstat (limited to 'parsing.lsp')
-rw-r--r-- | parsing.lsp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/parsing.lsp b/parsing.lsp new file mode 100644 index 0000000..3e26a35 --- /dev/null +++ b/parsing.lsp @@ -0,0 +1,43 @@ +(defpackage #:parsing + (:use #:openlisp #:lex #:abs-syn) + (:export + #:parse)) +(in-package #:parsing) + +(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>)) + (create (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 "parsing") |