aboutsummaryrefslogtreecommitdiff
path: root/src/main/stanza/ir-parser.stanza
diff options
context:
space:
mode:
authorazidar2015-07-30 11:50:54 -0700
committerazidar2015-07-30 11:50:54 -0700
commit9b2f96b8d0b6c7f4e6fefde918d7a335ccd7b7f3 (patch)
tree089578809d3ebe63ac5983ddda7fff7a6c00430a /src/main/stanza/ir-parser.stanza
parentd075e52e86648d345e89ae4a4c75fd3a98cc2788 (diff)
Updated lots of tests so they pass. Found one bug in expand whens
Diffstat (limited to 'src/main/stanza/ir-parser.stanza')
-rw-r--r--src/main/stanza/ir-parser.stanza13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/main/stanza/ir-parser.stanza b/src/main/stanza/ir-parser.stanza
index fdf4c383..9d9893c5 100644
--- a/src/main/stanza/ir-parser.stanza
+++ b/src/main/stanza/ir-parser.stanza
@@ -27,6 +27,15 @@ defn* apply-suffix-ops (x, fs:List) :
if empty?(fs) : x
else : apply-suffix-ops(head(fs)(x), tail(fs))
+defn parse-stmts (forms:List) :
+ val cs = Vector<Stmt>()
+ defn* loop (forms:List) :
+ match-syntax(forms) :
+ () : to-list(cs)
+ (?s:#stmt ?rest ...) : (add(cs, s), loop(rest))
+ (?rest ...) : FPE(rest, "Expected a statement here.")
+ loop(forms)
+
;======== Parser Utilities ==============
defn atom? (x) : unwrap-token(x) not-typeof List
@@ -167,6 +176,8 @@ defsyntax firrtl :
;Main Module Production
defrule module :
+ ;module = (module ?name:#id! #:! (?ps:#port ... ?rest ...)) :
+ ; InModule(first-info(form), name, ps, Begin(parse-stmts(rest)))
module = (module ?name:#id! #:! (?ps:#port ... ?cs:#stmt ... ?rest ...)) :
if not empty?(rest) :
FPE(rest, "Expected a statement here.")
@@ -235,6 +246,8 @@ defsyntax firrtl :
stmt = (?x:#exp := ?y:#exp!) : Connect(first-info(form),x, y)
stmt = (?x:#exp <> ?y:#exp!) : BulkConnect(first-info(form),x, y)
+ ;stmt = ((?s:#stmt ?rest ...)) :
+ ; Begin(List(s, parse-stmts(rest)))
stmt = ((?s:#stmt ?ss:#stmt ... ?rest ...)) :
if not empty?(rest) :
FPE(rest, "Expected a statement here.")