summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-04-10 02:11:43 -0400
committerbd <bdunahu@operationnull.com>2025-04-10 02:11:43 -0400
commit41baa17a9855bc970becf3dab02f7014753b45db (patch)
tree6dc77d605ee8567acbe7122ecd9f829b9065a60e /src
parent3eeebe73826906b1c598d5e5d207bfee936ed315 (diff)
Fix the rest of the initial parsing bugs, add high-level tests
Diffstat (limited to 'src')
-rw-r--r--src/package.lisp6
-rw-r--r--src/parse.lisp21
2 files changed, 12 insertions, 15 deletions
diff --git a/src/package.lisp b/src/package.lisp
index 4bdd274..115942e 100644
--- a/src/package.lisp
+++ b/src/package.lisp
@@ -21,8 +21,4 @@
(defpackage #:parse
(:use #:cl)
- (:export #:str->ast
- ;; exported for testing only
- #:register
- #:instr
- ))
+ (:export #:str->ast))
diff --git a/src/parse.lisp b/src/parse.lisp
index 109205f..d07fbde 100644
--- a/src/parse.lisp
+++ b/src/parse.lisp
@@ -13,7 +13,7 @@
(:constant nil))
(esrap:defrule nl-inc (+ #\newline)
- (:destructure (n)
+ (:lambda (n)
(declare (ignore n))
(incf line-number)
nil))
@@ -46,6 +46,9 @@
(:function cadr)
(:lambda (e) (list 'rr e)))
+(esrap:defrule var alpha
+ (:lambda (e) (list (list 'rr 0) (list 'var e))))
+
(esrap:defrule dereference (and (esrap:? (or #\+ #\-)) int #\( register #\))
(:destructure (s i1 w1 r w2)
(declare (ignore w1 w2))
@@ -107,12 +110,12 @@ DESTRUCTURE-PATTERN is the list of non-terminals on the right side of the gramma
(defrule-instr i-type-3 'i (0 1 2) register register immediate)
(defrule-instr j-type-3 'j (1 0) label)
-(esrap:defrule i-type-1 (and i-type-1-m space register space (or dereference alpha))
+(esrap:defrule i-type-1 (and i-type-1-m space register space (or dereference var))
(:destructure (m w1 s w2 di)
(declare (ignore w1 w2))
`(i ,m ,s ,@di)))
-(esrap:defrule i-type-2 (and i-type-2-m space register space (or dereference alpha))
+(esrap:defrule i-type-2 (and i-type-2-m space register space (or dereference var))
(:destructure (m w1 s w2 di)
(declare (ignore w1 w2))
`(i ,m ,@(util:insert-in-middle di s))))
@@ -142,8 +145,7 @@ DESTRUCTURE-PATTERN is the list of non-terminals on the right side of the gramma
(esrap:defrule text (and ".TEXT" (esrap:? space) nl (* text-line))
(:function cadddr)
- (:lambda (e)
- `(t ,@(remove nil e))))
+ (:lambda (e) `(x ,@(remove nil e))))
;;; defines rules to parse the .data segment
@@ -163,11 +165,10 @@ DESTRUCTURE-PATTERN is the list of non-terminals on the right side of the gramma
(esrap:defrule data (and ".DATA" (esrap:? space) nl (* data-line))
(:function cadddr)
- (:lambda (e)
- (list 'd (apply #'append e))))
+ (:lambda (e) `(d ,@(apply #'append e))))
;;; defines rules to parse a program
-(esrap:defrule str->ast (* (or data text))
- (:lambda (e)
- (list 'p (apply #'append e))))
+(esrap:defrule str->ast (and (* (or space nl)) (* (or data text)))
+ (:function cadr)
+ (:lambda (e) `(p ,@e)))