diff options
Diffstat (limited to 'SmurfParse.icl')
-rw-r--r-- | SmurfParse.icl | 20 |
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 |