From 050a93aca8840087b702dbd5b39565f56da00569 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 22 Jul 2016 20:28:51 -0700 Subject: 3131 Reorganize parser to make room for parsing pairs. But first test for pairs is still failing. --- lambda-to-mu.mu | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'lambda-to-mu.mu') diff --git a/lambda-to-mu.mu b/lambda-to-mu.mu index 8731f324..1c564db7 100644 --- a/lambda-to-mu.mu +++ b/lambda-to-mu.mu @@ -135,16 +135,33 @@ def parse in:address:array:character -> out:address:cell [ def parse in:address:stream -> out:address:cell, in:address:stream [ local-scope load-ingredients - b:address:buffer <- new-buffer 30 { done?:boolean <- end-of-stream? in break-if done? + c:character <- peek in + pair?:boolean <- equal c, 40/open-paren + { + break-if pair? + # atom + b:address:buffer <- new-buffer 30 + { + done?:boolean <- end-of-stream? in + break-if done? + c:character, in <- read in + b <- append b, c + loop + } + s:address:array:character <- buffer-to-array b + out <- new-atom s + } + { + break-unless pair? + # pair + out <- new-pair 0, 0 + } c:character, in <- read in - b <- append b, c loop } - s:address:array:character <- buffer-to-array b - out <- new-atom s ] scenario parse-single-letter-atom [ @@ -170,3 +187,23 @@ scenario parse-atom [ 11:array:character <- [abc] ] ] + +scenario parse-list [ + local-scope + s:address:array:character <- new [(abc def)] + x:address:cell <- parse s + p:pair, 10:boolean/raw <- maybe-convert *x, pair:variant + x1:address:cell <- get p, first:offset + x2:address:cell <- get p, rest:offset + s1:address:array:character, 11:boolean/raw <- maybe-convert *x1, atom:variant + s2:address:array:character, 12:boolean/raw <- maybe-convert *x2, atom:variant + 20:array:character/raw <- copy *s1 + 30:array:character/raw <- copy *s2 + memory-should-contain [ + 10 <- 1 # parse result is a pair + 11 <- 1 # result.first is an atom + 12 <- 1 # result.rest is an atom + 20:array:character <- [abc] # result.first + 30:array:character <- [def] # result.rest + ] +] -- cgit 1.4.1-2-gfad0