aboutsummaryrefslogtreecommitdiff
path: root/SmurfParse.icl
diff options
context:
space:
mode:
Diffstat (limited to 'SmurfParse.icl')
-rw-r--r--SmurfParse.icl20
1 files changed, 14 insertions, 6 deletions
diff --git a/SmurfParse.icl b/SmurfParse.icl
index bf59b64..385747c 100644
--- a/SmurfParse.icl
+++ b/SmurfParse.icl
@@ -20,10 +20,14 @@ eToVarChars :: Expr -> [VarChar]
eToVarChars (Lit s) = map Char $ fromString s
eToVarChars (Var v) = [VarString v]
eToVarChars (ECat a b) = eToVarChars a ++ eToVarChars b
-eToVarChars (EHead (Var v)) = abort "head of var\n"
-eToVarChars (EHead a) = [hd $ eToVarChars a]
-eToVarChars (ETail (Var v)) = abort "tail of var\n"
-eToVarChars (ETail a) = tl $ eToVarChars a
+eToVarChars (EHead a) = case eToVarChars a of
+ [Char c:cs] = [Char c]
+ [VarString s:cs] = [VarString (s % (0,0))]
+ [Quoted e:_] = abort "head of quoted\n"
+eToVarChars (ETail a) = case eToVarChars a of
+ [Char _:cs] = cs
+ [VarString s:cs] = [VarString (s % (1,size s - 1)):cs]
+ [Quoted e:_] = abort "tail of quoted\n"
eToVarChars (EQuotify a) = [Quoted a]
parse :: ![Char] -> Maybe Program
@@ -76,6 +80,10 @@ where
simplify :: Expr -> Expr
simplify (ECat a b) = case (simplify a, simplify b) of
- (Lit x, Lit y) = Lit $ x +++ y
- (x, y) = ECat x y
+ (Lit "", Lit y) = Lit y
+ (Lit x, Lit "") = Lit x
+ (Lit x, Lit y) = Lit $ x +++ y
+ (x, y) = ECat x y
+ simplify (EHead a) = EHead $ simplify a
+ simplify (ETail a) = ETail $ simplify a
simplify e = e