aboutsummaryrefslogtreecommitdiff
path: root/lllars
diff options
context:
space:
mode:
Diffstat (limited to 'lllars')
-rw-r--r--lllars/SYNTAX69
-rw-r--r--lllars/chal.lll14
-rw-r--r--lllars/megaparser.hs260
-rw-r--r--lllars/parser.hs21
4 files changed, 20 insertions, 344 deletions
diff --git a/lllars/SYNTAX b/lllars/SYNTAX
deleted file mode 100644
index 34a2353..0000000
--- a/lllars/SYNTAX
+++ /dev/null
@@ -1,69 +0,0 @@
-zehnah
-
-oft lars
-
-pointer
-
-no typen
-
-strongly typed (alles lars)
-
-no typecheck
-
-structs? no?
-
-immutable außer pointed
-
-lars is 37 bit
-
-larscalls (8159 DECT)
- bei 8159 write: larscall (arguments in lars object)
- read (QS of "read" in 36-base times "lars"): result in 8159
- write (QS of "write" in 36-base times "lars")
- jump (address)
-
-comments
-
-nur primzahlen eingeben (als emoji)
- unten geskippt
-
-```
-lars erster kommentar
-larslars zweite Kommentar
-larslarslars dritter Kommentar
-
-write 10 into address 0
-0lars10
-
-read value of at adress 0 in addres 10
-10larssral0
-
-read value at addres at adress 0 plus ten (sral binds hardest) in addres 10
-10larssralsral0+10
-
-make systemcall with 37bit value at address 8159
-larssral <lars|sral>
-
-fst goto label
-@lars
-
-snd goto label
-@larssral
-
-thrd goto label
-@larssrallars
-
-goto fst label
-srallars lars
-
-check if 0 at address 10 if true goto fst
-
-lars|sral 10 larssral
-
-check ifnot 0 at address 10 if true goto fst
-
-sral|lars 10 lars
-
-CYCLIC REDUNDANCY CHECK:
- redundancy: runs in THREE parallel runtimes (evil, haskell comp, kotlin comp) and compare results
- cyclic: recompilation from c to lars and back, n times, until 1GB(?) filesize
diff --git a/lllars/chal.lll b/lllars/chal.lll
index c0dd021..d4f41d8 100644
--- a/lllars/chal.lll
+++ b/lllars/chal.lll
@@ -17,21 +17,21 @@ lars|sral sral22 lars
31larssral31+20
31larssral31+30
31larssral31+10
+36lars1
31larssral31+10
31larssral31+16
-36lars1
37larssral36*1
+101lars16
+102lars23
38larssral36*10
-39larssral36*100
40larssral40+sral37
-40larssral40+sral38
+104lars31
+105lars40
+39larssral36*100
40larssral40+sral39
+40larssral40+sral38
100lars3
-101lars16
-102lars23
103lars25
-104lars31
-105lars40
@sral
300larssral200+100
sral|lars sralsral300 srallars
diff --git a/lllars/megaparser.hs b/lllars/megaparser.hs
deleted file mode 100644
index 72bf5ce..0000000
--- a/lllars/megaparser.hs
+++ /dev/null
@@ -1,260 +0,0 @@
-import Control.Monad.State
-import Data.Bits ( (.&.)
- , (.^.)
- , (.|.)
- )
-import Data.Functor ( ($>) )
-import Data.HashMap.Strict ( HashMap )
-import qualified Data.HashMap.Strict as M
-import Data.List ( intercalate )
-import Data.Void
-import Text.Megaparsec hiding ( Label
- , Pos
- , State
- , label
- )
-import Text.Megaparsec.Char hiding ( space )
-import qualified Text.Megaparsec.Char.Lexer as L
-
-type Parser = Parsec Void String
-type Program = [Instr]
-
-type Address = Int
-type Label = String
-
-data Access = Access Address | SAccess Access
-data Operator = ADD | MUL | SUB | DIV | AND | OR | XOR
- deriving Show
-data Addressation = Address Access | BinaryOperation Access Operator Access
-data Call = WriteCall | ReadCall
- deriving Show
-data BranchPolarity = IfTrue | IfFalse
- deriving Show
-data Instr = Comment String | Write Address Addressation | LarsCall Call | Label Label | GoTo Label | Branch BranchPolarity Access Label
-
-instance Show Access where
- show (Access address) = "{ \"address\": " <> show address <> " }"
- show (SAccess access ) = "{ \"sAddress\": " <> show access <> " }"
-
-instance Show Addressation where
- show (Address access) = "{ \"access\": " <> show access <> " }"
- show (BinaryOperation a op b) =
- "{ \"binaryOperation\": { \"a\": "
- <> show a
- <> ", \"op\": \""
- <> show op
- <> "\", \"b\": "
- <> show b
- <> " }}"
-
-instance Show Instr where
- show (Comment string) = "{ \"comment\": \"" <> string <> "\" }"
- show (Write target source) =
- "{ \"write\": { \"target\": "
- <> show target
- <> ", \"source\": "
- <> show source
- <> " }}"
- show (LarsCall call ) = "{ \"call\": " <> show call <> " }"
- show (Label label) = "{ \"label\": " <> show label <> " }"
- show (GoTo label) = "{ \"goto\": " <> show label <> " }"
- show (Branch pol jmp label) =
- "{ \"branch\": { \"polarity\": "
- <> show pol
- <> ", \"jmp\": "
- <> show jmp
- <> ", \"label\": "
- <> show label
- <> "}}"
-
-space :: Parser ()
-space = some (char ' ') $> ()
-
-comment :: Parser Instr
-comment =
- Comment <$> (some (string "lars") *> space *> many (satisfy (/= '\n')))
-
-access :: Parser Access
-access = (SAccess <$> (string "sral" *> access)) <|> (Access <$> L.decimal)
-
-binaryOperator :: Parser Operator
-binaryOperator =
- (char '+' $> ADD)
- <|> (char '-' $> SUB)
- <|> (char '*' $> MUL)
- <|> (char '/' $> DIV)
-
-addressation :: Parser Addressation
-addressation =
- try (BinaryOperation <$> access <*> binaryOperator <*> access)
- <|> (Address <$> access)
-
--- TODO: arguments
-call :: Parser Instr
-call =
- LarsCall
- <$> ( string "larssral"
- *> space
- *> ((string "lars" $> WriteCall) <|> (string "sral" $> ReadCall))
- )
-
-write :: Parser Instr
-write = do
- target <- L.decimal
- string "lars"
- source <- addressation
- return $ Write target source
-
-label :: Parser Label
-label = concat <$> some (string "lars" <|> string "sral")
-
-namedLabel :: Parser Instr
-namedLabel = Label <$> (char '@' *> label)
-
-goto :: Parser Instr
-goto = GoTo <$> (string "srallars " *> label)
-
-branch :: Parser Instr
-branch =
- Branch
- <$> ( ((string "lars|sral" $> IfTrue) <|> (string "sral|lars" $> IfFalse))
- <* space
- )
- <*> (access <* space)
- <*> label
-
-instr :: Parser Instr
-instr = try comment <|> write <|> call <|> namedLabel <|> goto <|> branch
-
-license :: Parser String
-license = string "!!! all rights reserved to lars <3 !!!\n\n"
-
-program :: Parser Program
-program = license *> sepEndBy instr (some $ char '\n')
-
-type EvalState = HashMap Address Int
-
-evalAccess :: Access -> State EvalState Int
-evalAccess = go 0
- where
- go 0 (Access address) = return address
- go n (Access address) = do
- m <- get
- go (n - 1) (Access $ M.lookupDefault 0 address m)
- go n (SAccess access) = go (n + 1) access
-
-evilOperation :: Int -> Operator -> Int -> Int
-evilOperation a ADD b = a + b
-evilOperation a MUL b = a * b
-evilOperation a SUB b = a - b
-evilOperation a DIV b = a `div` b
-evilOperation a AND b = a .&. b
-evilOperation a OR b = a .|. b
-evilOperation a XOR b = a .^. b
-
-evalAddressation :: Addressation -> State EvalState Int
-evalAddressation (Address access ) = evalAccess access
-evalAddressation (BinaryOperation a operator b) = do
- resA <- evalAccess a
- resB <- evalAccess b
- return $ evilOperation resA operator resB
-
-eval :: Int -> Program -> State EvalState ()
-eval n p = go (drop n p)
- where
- go ((Comment _ ) : ps) = go ps
- go ((Write address addressation) : ps) = do
- source <- evalAddressation addressation
- modify (M.insert address source)
- go ps
- go ((LarsCall call ) : ps) = go ps -- TODO
- go ((Label _ ) : ps) = go ps -- TODO: better
- go ((GoTo label) : ps) = do
- let is = [ i | (i, l@(Label n)) <- zip [0 ..] p, n == label ]
- case is of
- [i] -> eval (i + 1) p
- _ -> error $ "invalid jump " <> label
- go ((Branch IfTrue access label) : ps) = do
- address <- evalAccess access
- m <- get
- case address of
- 0 -> go ps
- _ -> go [GoTo label]
- go ((Branch IfFalse access label) : ps) = do
- address <- evalAccess access
- m <- get
- case address of
- 0 -> go [GoTo label]
- _ -> go ps
- go [] = return ()
-
-compileOperation :: String -> Operator -> String -> String
-compileOperation a ADD b = a <> " + " <> b
-compileOperation a MUL b = a <> " * " <> b
-compileOperation a SUB b = a <> " - " <> b
-compileOperation a DIV b = a <> " / " <> b
-compileOperation a AND b = a <> " & " <> b
-compileOperation a OR b = a <> " | " <> b
-compileOperation a XOR b = a <> " ^ " <> b
-
-compileAccess :: Access -> String
-compileAccess (Access address) = show address
-compileAccess (SAccess access ) = "heap[" <> compileAccess access <> "]"
-
-compileAddressation :: Addressation -> String
-compileAddressation (Address access) = compileAccess access
-compileAddressation (BinaryOperation a operator b) =
- compileOperation (compileAccess a) operator (compileAccess b)
-
-compile :: Program -> String
-compile ((Comment comment) : ps) = "// " <> comment <> "\n" ++ compile ps
-compile ((Write address addressation) : ps) =
- "heap["
- <> show address
- <> "] = "
- <> compileAddressation addressation
- <> ";\n"
- ++ compile ps
-compile ((LarsCall WriteCall) : ps) =
- "printf(\"%x\", heap[8159]); " ++ compile ps
-compile ((LarsCall call ) : ps) = compile ps -- TODO
-compile ((Label label) : ps) = "" <> label <> ":\n" ++ compile ps
-compile ((GoTo label) : ps) = "goto " <> label <> ";\n" ++ compile ps
-compile ((Branch IfTrue access label) : ps) =
- "if ("
- <> compileAccess access
- <> ")"
- <> " goto "
- <> label
- <> ";\n"
- ++ compile ps
-compile ((Branch IfFalse access label) : ps) =
- "if (!("
- <> compileAccess access
- <> "))"
- <> " goto "
- <> label
- <> ";\n"
- ++ compile ps
-compile [] = ""
-
-preamble :: String
-preamble =
- "#include <stdio.h>\nint main(int argc, char *argv[]) { unsigned int heap[10000] = { 0 }; "
-
-postamble :: String
-postamble = "printf(\"amen lars\\n\"); }"
-
-preamblify :: String -> String
-preamblify amble = preamble ++ amble ++ postamble
-
-main :: IO ()
-main = do
- f <- readFile "fac.lll"
- case runParser (program <* many (char '\n') <* eof) "" f of
- Right ps -> do
- -- let ev = runState (eval 0 ps) M.empty
- -- print ev
- putStrLn $ preamblify $ compile ps
- -- putStrLn $ "[" <> intercalate "," (show <$> ps) <> "]"
- Left err -> putStrLn $ errorBundlePretty err
diff --git a/lllars/parser.hs b/lllars/parser.hs
index f843849..da94ed7 100644
--- a/lllars/parser.hs
+++ b/lllars/parser.hs
@@ -1,6 +1,7 @@
import Data.Functor ( ($>) )
import Data.List ( intercalate )
import Data.Void
+import System.Environment
import Text.Megaparsec hiding ( Label
, Pos
, label
@@ -124,13 +125,17 @@ license = string "!!! all rights reserved to lars <3 !!!\n\n"
program :: Parser Program
program = license *> sepEndBy instr (some $ char '\n')
+parseProgram :: String -> IO ()
+parseProgram p = case runParser (program <* many (char '\n') <* eof) "" p of
+ Right ps ->
+ putStrLn $ "{ \"instructions\": [" <> intercalate "," (show <$> ps) <> "]}"
+ Left err -> putStrLn $ errorBundlePretty err
+
main :: IO ()
main = do
- f <- readFile "chal.lll"
- case runParser (program <* many (char '\n') <* eof) "" f of
- Right ps ->
- putStrLn
- $ "{ \"instructions\": ["
- <> intercalate "," (show <$> ps)
- <> "]}"
- Left err -> putStrLn $ errorBundlePretty err
+ args <- getArgs
+ case args of
+ [file] -> do
+ p <- readFile file
+ parseProgram p
+ _ -> putStrLn "Wrong number of arguments"