@@ -86,10 +86,15 @@ parseIfThenElse = IfThenElse <$> (P.try (C.reserved "if") *> C.indented *> parse
86 <*> (C.indented *> C.reserved "else" *> C.indented *> parseValue)
86 <*> (C.indented *> C.reserved "else" *> C.indented *> parseValue)
88parseBlock :: P.Parsec String ParseState Value
88parseBlock :: P.Parsec String ParseState Value
89−parseBlock = Block <$> (P.try (C.reserved "do") *> parseManyStatements)
89+parseBlock = Block <$> parseManyStatements
91parseManyStatements :: P.Parsec String ParseState [Statement]
91parseManyStatements :: P.Parsec String ParseState [Statement]
92+parseManyStatements = (do
93+ C.lexeme $ P.char '{'
92−parseManyStatements = C.indented *> C.mark (P.many (C.same *> C.mark parseStatement)) P.<?> "block"
95+ sts <- C.mark (P.many (C.same *> C.mark parseStatement))
96+ C.lexeme (P.char '}')
97+ return sts) P.<?> "block"
94parseValueAtom :: P.Parsec String ParseState Value
99parseValueAtom :: P.Parsec String ParseState Value
95parseValueAtom = C.indented *> P.choice
100parseValueAtom = C.indented *> P.choice
@@ -97,7 +102,7 @@ parseValueAtom = C.indented *> P.choice
97 , P.try parseStringLiteral
102 , P.try parseStringLiteral
98 , P.try parseBooleanLiteral
103 , P.try parseBooleanLiteral
99 , parseArrayLiteral
104 , parseArrayLiteral
100− , parseObjectLiteral
105+ , P.try parseObjectLiteral
101 , parseAbs
106 , parseAbs
102 , P.try parseConstructor
107 , P.try parseConstructor
103 , P.try parseVar
108 , P.try parseVar
@@ -143,6 +148,7 @@ parseVariableIntroduction = do
143 name <- C.indented *> C.parseIdent
148 name <- C.indented *> C.parseIdent
144 C.lexeme $ C.indented *> P.char '='
149 C.lexeme $ C.indented *> P.char '='
145 value <- parseValue
150 value <- parseValue
151+ C.indented *> C.semi
146 return $ VariableIntroduction name value
152 return $ VariableIntroduction name value
148parseAssignment :: P.Parsec String ParseState Statement
154parseAssignment :: P.Parsec String ParseState Statement
@@ -150,21 +156,22 @@ parseAssignment = do
150 tgt <- C.parseIdent
156 tgt <- C.parseIdent
151 C.lexeme $ C.indented *> P.char '='
157 C.lexeme $ C.indented *> P.char '='
152 value <- parseValue
158 value <- parseValue
159+ C.indented *> C.semi
153 return $ Assignment tgt value
160 return $ Assignment tgt value
155parseWhile :: P.Parsec String ParseState Statement
162parseWhile :: P.Parsec String ParseState Statement
156−parseWhile = While <$> (C.reserved "while" *> C.indented *> parseValue <* C.indented <* C.colon)
163+parseWhile = While <$> (C.reserved "while" *> C.indented *> C.parens parseValue)
157− <*> parseManyStatements
164+ <*> (C.indented *> parseManyStatements)
159parseFor :: P.Parsec String ParseState Statement
166parseFor :: P.Parsec String ParseState Statement
160−parseFor = For <$> (C.reserved "for" *> C.indented *> C.parseIdent)
167+parseFor = For <$> (C.reserved "for" *> C.indented *> C.lexeme (P.char '(') *> C.indented *> C.parseIdent)
161 <*> (C.indented *> C.lexeme (P.string "<-") *> parseValue)
168 <*> (C.indented *> C.lexeme (P.string "<-") *> parseValue)
162− <*> (C.indented *> C.reserved "until" *> parseValue <* C.indented <* C.colon)
169+ <*> (C.indented *> C.reserved "until" *> parseValue <* C.indented <* C.lexeme (P.char ')'))
163 <*> parseManyStatements
170 <*> parseManyStatements
165parseForEach :: P.Parsec String ParseState Statement
172parseForEach :: P.Parsec String ParseState Statement
166−parseForEach = ForEach <$> (C.reserved "foreach" *> C.indented *> C.parseIdent)
173+parseForEach = ForEach <$> (C.reserved "foreach" *> C.indented *> C.lexeme (P.char '(') *> C.indented *> C.parseIdent)
167− <*> (C.indented *> C.reserved "in" *> parseValue <* C.indented <* C.colon)
174+ <*> (C.indented *> C.reserved "in" *> parseValue <* C.lexeme (P.char ')'))
168 <*> parseManyStatements
175 <*> parseManyStatements
170parseIf :: P.Parsec String ParseState Statement
177parseIf :: P.Parsec String ParseState Statement
@@ -172,16 +179,16 @@ parseIf = If <$> parseIfStatement
173parseIfStatement :: P.Parsec String ParseState IfStatement
180parseIfStatement :: P.Parsec String ParseState IfStatement
174parseIfStatement =
181parseIfStatement =
175− IfStatement <$> (C.reserved "if" *> C.indented *> parseValue <* C.indented <* C.colon)
182+ IfStatement <$> (C.reserved "if" *> C.indented *> C.parens parseValue)
176 <*> parseManyStatements
183 <*> parseManyStatements
177− <*> P.optionMaybe (C.same *> parseElseStatement)
184+ <*> P.optionMaybe parseElseStatement
179parseElseStatement :: P.Parsec String ParseState ElseStatement
186parseElseStatement :: P.Parsec String ParseState ElseStatement
180−parseElseStatement = C.reserved "else" >> (ElseIf <$> (C.indented *> parseIfStatement)
187+parseElseStatement = C.reserved "else" >> (ElseIf <$> parseIfStatement
181− <|> Else <$> (C.indented *> C.colon *> parseManyStatements))
188+ <|> Else <$> parseManyStatements)
183parseReturn :: P.Parsec String ParseState Statement
190parseReturn :: P.Parsec String ParseState Statement
184−parseReturn = Return <$> (C.reserved "return" *> parseValue)
191+parseReturn = Return <$> (C.reserved "return" *> parseValue <* C.indented <* C.semi)
186parseStatement :: P.Parsec String ParseState Statement
193parseStatement :: P.Parsec String ParseState Statement
187parseStatement = P.choice (map P.try
194parseStatement = P.choice (map P.try