1module RTS.BCParser where
8import Text.ParserCombinators.Parsec
9import Text.ParserCombinators.Parsec.Error
10import Text.ParserCombinators.Parsec.Expr
11import Text.ParserCombinators.Parsec.Language
12import qualified Text.ParserCombinators.Parsec.Token as PTok
15import Control.Monad.State
20type TokenParser a = PTok.TokenParser a
22type BParser = GenParser Char ()
24lexer :: TokenParser ()
25lexer = PTok.makeTokenParser idrisDef
27whiteSpace= PTok.whiteSpace lexer
28lexeme = PTok.lexeme lexer
29symbol = PTok.symbol lexer
30natural = PTok.natural lexer
31parens = PTok.parens lexer
33comma = PTok.comma lexer
34identifier= PTok.identifier lexer
35reserved = PTok.reserved lexer
36operator = PTok.operator lexer
37reservedOp= PTok.reservedOp lexer
38integer = PTok.integer lexer
39float = PTok.float lexer
40strlit = PTok.stringLiteral lexer
41chlit = PTok.charLiteral lexer
44parseFile :: FilePath -> IO BCProg
45parseFile fname = do fp <- readFile fname
46 case runParser pProgram () fname fp of
47 Left err-> fail (show err)
50pProgram :: BParser BCProg
51pProgram = do fs <- many1 pFun
54pFun :: BParser (Name, Bytecode)
55pFun = do n <- iName []
57 bc <- many1 pInstruction
60pInstruction :: BParser BCOp
62 try (do reserved "PUSH"; v <- pValue; return (PUSH v))
63 <|> try (do reserved "SLIDE"; v <- integer; return (SLIDE (fromInteger v)))
64 <|> try (do reserved "DISCARD"; v <- integer; return (DISCARD (fromInteger v)))
65 <|> try (do reserved "DISCARDINT"; v <- integer
66 return (DISCARDINT (fromInteger v)))
67 <|> try (do reserved "DISCARDFLOAT"; v <- integer
68 return (DISCARDFLOAT (fromInteger v)))
69 <|> try (do reserved "EVAL"; return (EVAL True))
70 <|> try (do reserved "EVAL_NOUPDATE"; return (EVAL False))
71 <|> try (do reserved "MKCON"; t <- integer; a <- integer;
72 return (MKCON (fromInteger t) (fromInteger a)))
73 <|> try (do reserved "MKTHUNK"; n <- iName []; arg <- integer; arity <- integer
74 return (MKTHUNK n (fromInteger arg) (fromInteger arity)))
75 <|> try (do reserved "MKUNIT"; return MKUNIT)
76 <|> try (do reserved "CALL"; n <- iName []; i <- integer;
77 return (CALL n (fromInteger i)))
78 <|> try (do reserved "ERROR"; s <- strlit; return (ERROR s))
79 <|> try (do reserved "SPLIT"; return SPLIT)
80 <|> try (do reserved "DUMP"; return DUMP)
81 <|> do reserved "CASE"; s <- sepBy1 pAlt (lchar '|')
82 def <- option Nothing (do reserved "default"; symbol "->";
83 bc <- many1 pInstruction
86 where pAlt = try (do t <- integer; symbol "->"
87 bc <- many1 pInstruction
88 return (fromInteger t, bc))
90pValue :: BParser SValue
91pValue = try (do x <- integer; lchar 'L'; return (VBigInt x))
92 <|> try (do x <- integer; return (VInt (fromInteger x)))
93 <|> try (do x <- float; return (VFloat x))
94 <|> try (do x <- strlit; return (VString x))
95 <|> try (do x <- chlit; return (VChar x))
96 <|> try (do lchar 'S'; x <- integer; return (VRef (fromInteger x)))
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list