aboutsummaryrefslogtreecommitdiff
path: root/Sil/Parse.icl
diff options
context:
space:
mode:
Diffstat (limited to 'Sil/Parse.icl')
-rw-r--r--Sil/Parse.icl40
1 files changed, 26 insertions, 14 deletions
diff --git a/Sil/Parse.icl b/Sil/Parse.icl
index 2ee2bc1..806ac69 100644
--- a/Sil/Parse.icl
+++ b/Sil/Parse.icl
@@ -71,18 +71,19 @@ where
tks ['=':'=':r] t = tks r [TDoubleEquals :t]
tks ['|':'|':r] t = tks r [TDoubleBar :t]
tks ['&':'&':r] t = tks r [TDoubleAmpersand:t]
- tks ['(':r] t = tks r [TParenOpen :t]
- tks [')':r] t = tks r [TParenClose:t]
- tks ['{':r] t = tks r [TBraceOpen :t]
- tks ['}':r] t = tks r [TBraceClose:t]
- tks [',':r] t = tks r [TComma :t]
- tks [';':r] t = tks r [TSemicolon :t]
- tks ['~':r] t = tks r [TTilde :t]
- tks ['+':r] t = tks r [TPlus :t]
- tks ['-':r] t = tks r [TMinus :t]
- tks ['*':r] t = tks r [TStar :t]
- tks ['/':r] t = tks r [TSlash :t]
- tks ['%':r] t = tks r [TPercent :t]
+ tks ['(':r] t = tks r [TParenOpen :t]
+ tks [')':r] t = tks r [TParenClose :t]
+ tks ['{':r] t = tks r [TBraceOpen :t]
+ tks ['}':r] t = tks r [TBraceClose :t]
+ tks [',':r] t = tks r [TComma :t]
+ tks [';':r] t = tks r [TSemicolon :t]
+ tks ['!':r] t = tks r [TExclamation:t]
+ tks ['~':r] t = tks r [TTilde :t]
+ tks ['+':r] t = tks r [TPlus :t]
+ tks ['-':r] t = tks r [TMinus :t]
+ tks ['*':r] t = tks r [TStar :t]
+ tks ['/':r] t = tks r [TSlash :t]
+ tks ['%':r] t = tks r [TPercent :t]
tks ['i':'f' :s:r] t | isSpace s = tks r [TIf :t]
tks ['e':'l':'s':'e' :s:r] t | isSpace s = tks r [TElse :t]
tks ['w':'h':'i':'l':'e' :s:r] t | isSpace s = tks r [TWhile :t]
@@ -142,7 +143,7 @@ statement = declaration
<|> liftM Application (expression <* item TSemicolon)
<|> return
<|> if`
- //<|> while
+ <|> while
<|> machinecode
where
declaration :: Parser Token Statement
@@ -168,6 +169,12 @@ where
braced codeblock >>= \block ->
pure (cond, block)
+ while :: Parser Token Statement
+ while = item TWhile *>
+ parenthised expression >>= \cond ->
+ braced codeblock >>= \do ->
+ pure $ While cond do
+
expression :: Parser Token Expression
expression
= rightAssoc (op TDoubleBar LogOr)
@@ -198,9 +205,14 @@ where
noInfix :: Parser Token Expression
noInfix
= liftM2 App name (item TParenOpen *> seplist TComma expression <* item TParenClose)
- <|> liftM (BuiltinApp Neg) (item TTilde *> noInfix)
+ <|> op TTilde Neg
+ <|> op TExclamation Not
<|> liftM Literal literal
<|> liftM Name name
+ <|> parenthised expression
+ where
+ op :: Token Op1 -> Parser Token Expression
+ op token operator = liftM (BuiltinApp operator) (item token *> noInfix)
name :: Parser Token Name
name = liftM (\(TName s) -> s) $ satisfy isName <?> Expected "name"