start of code generation
[cc1516.git] / spl.icl
diff --git a/spl.icl b/spl.icl
index c42412c..e88e943 100644 (file)
--- a/spl.icl
+++ b/spl.icl
@@ -19,6 +19,7 @@ import parse
 import lex
 import sem
 import AST
+import gen
 from yard import :: Error, instance toString Error
 
 :: Opts = {
@@ -27,6 +28,7 @@ from yard import :: Error, instance toString Error
        lex :: Bool,
        parse :: Bool,
        sem :: Bool,
+    gen :: Bool,
        fp :: Maybe String,
        help :: Bool}
 
@@ -58,23 +60,29 @@ Start w
 = case contents of
        (Left cs) = snd $ fclose (stdin <<< cs) w
        (Right cs) = case lexer cs of
-               (Left e) = snd $ fclose (stdin <<< toString e) w
+               (Left e) = snd $ fclose (stdin <<< toString e <<< "\n") w
                (Right lexOut)
                # stdin = if (not args.lex) stdin (
                        stdin <<< "//LEXER\n" <<< printTokens lexOut <<< "//LEXER\n")
                = case parser lexOut of
-                       (Left e) = snd $ fclose (stdin <<< toString e) w
+                       (Left e) = snd $ fclose (stdin <<< toString e <<< "\n") w
                        (Right parseOut)
                        # stdin = if (not args.parse) stdin (
                                stdin <<<  "//PARSER\n" <<< toString parseOut <<< "//PARSER\n")
                        = case sem parseOut of
-                               (Left e) = snd $ fclose (stdin <<< join "\n" (map toString e)) w
-                               (Right (semOut, gamma))
-                               # stdin = if (not args.sem) stdin (stdin 
-                                       <<< "//SEM G\n" <<< toString gamma <<< "//SEM A\n"
-                                       <<< "//SEM A\n" <<< toString semOut <<< "//SEM A\n")
+                               (Left e) = snd $ fclose (stdin <<< join "\n" (map toString e) <<< "\n") w
+                               (Right ast)
+                               # stdin = if (not args.sem) stdin (stdin
+                                       <<< "//SEM G\n" <<< toString ast <<< "//SEMA\n")
+                # stdin = if (not args.gen) stdin (stdin
+                    <<< "//CODE GEN\n" <<< gen ast <<< "\n//CODE GEN\n")
                                = snd $ fclose (stdin <<< "\n") w
                where
+                       printConstraints :: Constraints -> String
+                       printConstraints [] = ""
+                       printConstraints [(t1, t2):ts] = concat [
+                               "(", toString t1, ",", toString t2, ")"] +++ printConstraints ts
+
                        printTokens :: [Token] -> String
                        printTokens ts = concat $ flatten $ map pt ts
                                where
@@ -90,6 +98,7 @@ parseArgs w
        lex=False,
        parse=False,
        sem=True,
+    gen=True,
        fp=Nothing,
        help=False}, w)
 where
@@ -103,6 +112,8 @@ where
        pa ["--no-parse":r] o = pa r {o & parse=False}
        pa ["--sem":r] o = pa r {o & sem=True}
        pa ["--no-sem":r] o = pa r {o & sem=False}
+    pa ["--gen":r] o = pa r {o & gen=True}
+    pa ["--no-gen":r] o = pa r {o & gen=False}
        pa [x:r] o = pa r {o & fp=Just x}
 
 readFileOrStdin :: *File (Maybe String) *World -> *(Either String [Char], *File, *World)