about summary refs log tree commit diff stats
path: root/parse.lsp
diff options
context:
space:
mode:
authorDarren Bane <darren.bane@gmail.com>2020-11-18 23:59:17 +0000
committerDarren Bane <darren.bane@gmail.com>2020-11-18 23:59:17 +0000
commit6e7cdcd4280f5330229ec9c943b9caf090846452 (patch)
tree7e7542c9edb9ef9805022ca105f42a56372aad9b /parse.lsp
parentf1dd340e2def134d0641ebbbf92934f69086b643 (diff)
downloadlsp-6e7cdcd4280f5330229ec9c943b9caf090846452.tar.gz
Checkpointing from my Mac
Diffstat (limited to 'parse.lsp')
-rw-r--r--parse.lsp43
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")