@@ -62,6 +62,7 @@ fovm f = do defs <- parseFOVM f
6262 d <- getDataDir
6363 mprog <- readFile (d ++ "/rts/idris_main.c")
6464 putStrLn mprog
65+ err -> print err
6566
6667parseFOVM :: FilePath -> IO [(Name, LDecl)]
6768parseFOVM fname = do -- putStrLn $ "Reading " ++ fname
@@ -92,18 +93,35 @@ pLDecl = do reserved "data"
9293pLExp = buildExpressionParser optable pLExp'
9394
9495optable = [[binary "*" (\x y -> LOp LTimes [x,y]) AssocLeft,
95− binary "/" (\x y -> LOp LDiv [x,y]) AssocLeft],
96− [binary "+" (\x y -> LOp LPlus [x,y]) AssocLeft,
97− binary "-" (\x y -> LOp LMinus [x,y]) AssocLeft],
98− [binary "==" (\x y -> LOp LEq [x, y]) AssocNone]]
96+ binary "/" (\x y -> LOp LDiv [x,y]) AssocLeft,
97+ binary "*." (\x y -> LOp LFTimes [x,y]) AssocLeft,
98+ binary "/." (\x y -> LOp LFTimes [x,y]) AssocLeft
99+ ],
100+ [
101+ binary "+" (\x y -> LOp LPlus [x,y]) AssocLeft,
102+ binary "-" (\x y -> LOp LMinus [x,y]) AssocLeft,
103+ binary "++" (\x y -> LOp LStrConcat [x,y]) AssocLeft,
104+ binary "+." (\x y -> LOp LFPlus [x,y]) AssocLeft,
105+ binary "-." (\x y -> LOp LFMinus [x,y]) AssocLeft
106+ ],
107+ [
108+ binary "==" (\x y -> LOp LEq [x, y]) AssocNone,
109+ binary "==." (\x y -> LOp LFEq [x, y]) AssocNone,
110+ binary "<" (\x y -> LOp LLt [x, y]) AssocNone,
111+ binary "<." (\x y -> LOp LFLt [x, y]) AssocNone,
112+ binary ">" (\x y -> LOp LGt [x, y]) AssocNone,
113+ binary ">." (\x y -> LOp LFGt [x, y]) AssocNone,
114+ binary "<=" (\x y -> LOp LLe [x, y]) AssocNone,
115+ binary "<=." (\x y -> LOp LFLe [x, y]) AssocNone,
116+ binary ">=" (\x y -> LOp LGe [x, y]) AssocNone,
117+ binary ">=." (\x y -> LOp LFGe [x, y]) AssocNone
118+ ]]
99119
100120binary name f assoc = Infix (do reservedOp name; return f) assoc
101121
102122pLExp' :: LParser LExp
103−pLExp' = try (do reserved "printNum"; e <- pLExp
104− return (LOp LPrintNum [e]))
105− <|> try (do reserved "print"; e <- pLExp
106− return (LOp LPrintStr [e]))
123+pLExp' = try (do lchar '%'; pCast)
124+ <|> try (do lchar '%'; pPrim)
107125 <|> try (do tc <- option False (do lchar '%'; reserved "tc"; return True)
108126 x <- iName [];
109127 lchar '('
@@ -115,10 +133,25 @@ pLExp' = try (do reserved "printNum"; e <- pLExp
115133 <|> do reserved "let"; x <- iName []; lchar '='; v <- pLExp
116134 reserved "in"; e <- pLExp
117135 return (LLet x v e)
136+ <|> do reserved "foreign"; l <- pLang; t <- pType
137+ fname <- strlit
138+ lchar '('
139+ fargs <- sepBy (do t' <- pType; e <- pLExp; return (t', e)) (lchar ',')
140+ lchar ')'
141+ return (LForeign l t fname fargs)
118142 <|> pCase
119143 <|> do x <- iName []
120144 return (LV (Glob x))
121145
146+pLang = do reserved "C"; return LANG_C
147+
148+pType = do reserved "Int"; return FInt
149+ <|> do reserved "Float"; return FDouble
150+ <|> do reserved "String"; return FString
151+ <|> do reserved "Unit"; return FUnit
152+ <|> do reserved "Ptr"; return FPtr
153+ <|> do reserved "Any"; return FAny
154+
122155pCase :: LParser LExp
123156pCase = do reserved "case"; e <- pLExp; reserved "of"
124157 lchar '{'
@@ -126,6 +159,22 @@ pCase = do reserved "case"; e <- pLExp; reserved "of"
126159 lchar '}'
127160 return (LCase e alts)
128161
162+pCast :: LParser LExp
163+pCast = do reserved "FloatString"; e <- pLExp; return (LOp LFloatStr [e])
164+ <|> do reserved "StringFloat"; e <- pLExp; return (LOp LStrFloat [e])
165+ <|> do reserved "FloatInt"; e <- pLExp; return (LOp LFloatInt [e])
166+ <|> do reserved "IntFloat"; e <- pLExp; return (LOp LIntFloat [e])
167+ <|> do reserved "StringInt"; e <- pLExp; return (LOp LStrInt [e])
168+ <|> do reserved "IntString"; e <- pLExp; return (LOp LIntStr [e])
169+
170+pPrim :: LParser LExp
171+pPrim = do reserved "StrEq"; e <- pLExp; e' <- pLExp; return (LOp LStrEq [e, e'])
172+ <|> do reserved "StrLt"; e <- pLExp; e' <- pLExp; return (LOp LStrLt [e, e'])
173+ <|> do reserved "StrLen"; e <- pLExp; return (LOp LStrLen [e])
174+ <|> do reserved "ReadString"; return (LOp LReadStr [])
175+ <|> do reserved "WriteString"; e <- pLExp; return (LOp LPrintStr [e])
176+ <|> do reserved "WriteInt"; e <- pLExp; return (LOp LPrintNum [e])
177+
129178pAlt :: LParser LAlt
130179pAlt = try (do x <- iName []
131180 lchar '('; args <- sepBy1 (iName []) (lchar ','); lchar ')'