diff options
| author | aarne <unknown> | 2004-09-25 08:24:11 +0000 |
|---|---|---|
| committer | aarne <unknown> | 2004-09-25 08:24:11 +0000 |
| commit | 5a208ce3ea26726d15e814c0498680597cca45fa (patch) | |
| tree | 89ca12f9b6f9fe16cf4bcd6d165e13f3021ce619 /examples/gfcc/compiler/CleanJVM.hs | |
| parent | ff2a2895c08b667894b565c8d39f0bf63d85492a (diff) | |
compiler works on abs and fibonacci
Diffstat (limited to 'examples/gfcc/compiler/CleanJVM.hs')
| -rw-r--r-- | examples/gfcc/compiler/CleanJVM.hs | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/examples/gfcc/compiler/CleanJVM.hs b/examples/gfcc/compiler/CleanJVM.hs index 4bbf011d8..72a0060c2 100644 --- a/examples/gfcc/compiler/CleanJVM.hs +++ b/examples/gfcc/compiler/CleanJVM.hs @@ -3,6 +3,8 @@ module Main where import Char import System +--- now works for programs with exactly 2 functions, main last + main :: IO () main = do jvm:src:_ <- getArgs @@ -12,30 +14,38 @@ main = do writeFile obj $ boilerplate cls appendFile obj $ mkJVM cls s putStrLn $ "wrote file " ++ obj + system $ "jasmin " ++ obj + return () mkJVM :: String -> String -> String mkJVM cls = unlines . map trans . lines where trans s = case words s of - ".method":p:s:f:ns -> unwords [".method",p,s, unindex f ++ typesig ns] - ".limit":"locals":ns -> ".limit locals " ++ show (length ns - 1) - "invokestatic":t:"runtime/lt":ns -> ".invokestatic " ++ "runtime/" ++ t ++ "lt" ++ typesig ns + ".method":p:s:f:ns + | take 5 f == "main_" -> ".method public static main([Ljava/lang/String;)V" + | otherwise -> unwords [".method",p,s, unindex f ++ typesig ns] + ".limit":"locals":ns -> ".limit locals " ++ show (length ns) + "invokestatic":t:f:ns | take 8 f == "runtime/" -> + "invokestatic " ++ "runtime/" ++ t ++ drop 8 f ++ typesig ns "invokestatic":f:ns -> "invokestatic " ++ cls ++ "/" ++ unindex f ++ typesig ns "alloc":ns -> "; " ++ s + t:('_':instr):[] -> t ++ instr t:('_':instr):x:_ -> t ++ instr ++ " " ++ address x - "goto":ns -> "goto " ++ label ns - "ifeq":ns -> "ifzero " ++ label ns - "label":ns -> label ns + "goto":ns -> "goto " ++ label ns + "ifeq":ns -> "ifeq " ++ label ns + "label":ns -> label ns ++ ":" ";":[] -> "" _ -> s where unindex = reverse . drop 1 . dropWhile (/= '_') . reverse typesig = init . map toUpper . concat - address = reverse . takeWhile (/= '_') . reverse + address x = case (filter isDigit . reverse . takeWhile (/= '_') . reverse) x of + s@(_:_) -> show $ read s - (1 :: Int) + s -> s label = init . concat boilerplate :: String -> String boilerplate cls = unlines [ - ".class public " ++ cls ++ ".j", + ".class public " ++ cls, ".super java/lang/Object", ".method public <init>()V", "aload_0", |
