oplang-0.5.0.0: src/Language/OpLang/Syntax.hs
{-# LANGUAGE StrictData #-}
module Language.OpLang.Syntax where
import Data.Int(Int8)
import Data.Map.Strict(Map)
type Name = Char
type Val = Int8
type Offset = Int
-- Surface-level AST, produced by the parser
data Op
= Incr
| Decr
| MoveL
| MoveR
| Read'
| Write'
| Pop'
| Push'
| Loop' [Op]
| Call' Name
deriving stock Show
-- Internal IR, used for optimizations and codegen
data Instr
= Add Offset Val
| Set Offset Val
| Read Offset
| Write Offset
| WriteKnown Val
| Pop Offset
| Push Offset
| PushKnown Val
| Move Offset
| Loop [Instr]
| Call Name
| AddMul Offset Offset Val
deriving stock Show
data Program op
= Program
{ opDefs :: Map Name [op]
, topLevel :: [op]
}
deriving stock Show