@@ -46,7 +46,7 @@ lchar = lexeme.char
47fovm :: FilePath -> IO ()
47fovm :: FilePath -> IO ()
48fovm f = do defs <- parseFOVM f
48fovm f = do defs <- parseFOVM f
49− codegenC defs "a.out" True [] "" DEBUG
49+ codegenC defs "a.out" True ["math.h"] "" TRACE
51parseFOVM :: FilePath -> IO [(Name, LDecl)]
51parseFOVM :: FilePath -> IO [(Name, LDecl)]
52parseFOVM fname = do -- putStrLn $ "Reading " ++ fname
52parseFOVM fname = do -- putStrLn $ "Reading " ++ fname
@@ -144,20 +144,37 @@ pCase = do reserved "case"; e <- pLExp; reserved "of"
144 return (LCase e alts)
144 return (LCase e alts)
146pCast :: LParser LExp
146pCast :: LParser LExp
147−pCast = do reserved "FloatString"; e <- pLExp; return (LOp LFloatStr [e])
147+pCast = do reserved "FloatString"; lchar '('; e <- pLExp; lchar ')'
148+ return (LOp LFloatStr [e])
148− <|> do reserved "StringFloat"; e <- pLExp; return (LOp LStrFloat [e])
149+ <|> do reserved "StringFloat"; lchar '('; e <- pLExp; lchar ')'
150+ return (LOp LStrFloat [e])
149− <|> do reserved "FloatInt"; e <- pLExp; return (LOp LFloatInt [e])
151+ <|> do reserved "FloatInt"; lchar '('; e <- pLExp; lchar ')'
152+ return (LOp LFloatInt [e])
150− <|> do reserved "IntFloat"; e <- pLExp; return (LOp LIntFloat [e])
153+ <|> do reserved "IntFloat"; lchar '('; e <- pLExp; lchar ')'
154+ return (LOp LIntFloat [e])
151− <|> do reserved "StringInt"; e <- pLExp; return (LOp LStrInt [e])
155+ <|> do reserved "StringInt"; lchar '('; e <- pLExp; lchar ')'
156+ return (LOp LStrInt [e])
152− <|> do reserved "IntString"; e <- pLExp; return (LOp LIntStr [e])
157+ <|> do reserved "IntString"; lchar '('; e <- pLExp; lchar ')'
158+ return (LOp LIntStr [e])
154pPrim :: LParser LExp
160pPrim :: LParser LExp
155−pPrim = do reserved "StrEq"; e <- pLExp; e' <- pLExp; return (LOp LStrEq [e, e'])
161+pPrim = do reserved "StrEq"; lchar '(';
162+ e <- pLExp; lchar ',';
163+ e' <- pLExp; lchar ')';
164+ return (LOp LStrEq [e, e'])
165+ <|> do reserved "StrLt"; lchar '('
166+ e <- pLExp; lchar ','; e' <- pLExp;
156− <|> do reserved "StrLt"; e <- pLExp; e' <- pLExp; return (LOp LStrLt [e, e'])
168+ return (LOp LStrLt [e, e'])
157− <|> do reserved "StrLen"; e <- pLExp; return (LOp LStrLen [e])
169+ <|> do reserved "StrLen"; lchar '('; e <- pLExp; lchar ')';
170+ return (LOp LStrLen [e])
158 <|> do reserved "ReadString"; return (LOp LReadStr [])
171 <|> do reserved "ReadString"; return (LOp LReadStr [])
159− <|> do reserved "WriteString"; e <- pLExp; return (LOp LPrintStr [e])
172+ <|> do reserved "WriteString"; lchar '(';
173+ e <- pLExp; lchar ')'
174+ return (LOp LPrintStr [e])
175+ <|> do reserved "WriteInt"; lchar '(';
176+ e <- pLExp; lchar ')';
160− <|> do reserved "WriteInt"; e <- pLExp; return (LOp LPrintNum [e])
177+ return (LOp LPrintNum [e])
162pAlt :: LParser LAlt
179pAlt :: LParser LAlt
163pAlt = try (do x <- iName []
180pAlt = try (do x <- iName []