pec-0.2.0: LLVM.grm
data Module
| Module DefineList
data Define
| Define "define" Type lident "(" TVarList ")" "{" StmtList "}"
| Declare "declare" Type lident "(" TypeList ")"
| TypeD lident "=" "type" Type
| StringD lident "= private constant [" number "x i8 ] c" "" "\"" "" lident "" "\\00\""
data Stmt
| LetS lident "=" Exp
| StoreS "store" Atom "" "," TVar
| CallS "call" TVar "(" AtomList ")"
| SwitchS "switch" Atom "" ", label %" "" lident "[" SwitchAltList "]"
| ReturnS "ret" Atom
| LabelS lident "" ":"
| BrS "br i1" UAtom "" ", label %" "" lident "" ", label %" "" lident
| Br0S "br label %" "" lident
| TagS "store" Atom "" ","
| NoOpS ";"
data Exp
| CallE "call" TVar "(" AtomList ")"
| CastE Cast TVar "to" Type
| AllocaE "alloca" Type
| LoadE "load" TVar
| AtomE Atom
| BinOpE BinOp Type UAtom "" "," UAtom
| IdxE "getelementptr inbounds" TVar "" ", i32 0," Atom
data Cast
| Bitcast "bitcast"
| Sitofp "sitofp"
| Uitofp "uitofp"
| Fptosi "fptosi"
| Fptoui "fptoui"
| Trunc "trunc"
| Zext "zext"
| Sext "sext"
| Fptrunc "fptrunc"
| Fpext "fpext"
data BinOp
| Icmp "icmp" ICond
| Fcmp "fcmp" FCond
| Add "add nuw nsw"
| Fadd "fadd"
| Sub "sub nuw nsw"
| Fsub "fsub"
| Mul "mul nuw nsw"
| Fmul "fmul"
| Udiv "udiv"
| Sdiv "sdiv"
| Fdiv "fdiv"
| Urem "urem"
| Srem "srem"
| Frem "frem"
| Shl "shl"
| Lshr "lshr"
-- | Ashr "ashr"
| And "and"
| Or "or"
| Xor "xor"
data Atom
| LitA TLit
| VarA TVar
data UAtom
| LitUA Lit
| VarUA lident
data ICond
| Equ "eq"
| Neq "ne"
| Ugt "ugt"
| Sgt "sgt"
| Uge "uge"
| Sge "sge"
| Ult "ult"
| Slt "slt"
| Ule "ule"
| Sle "sle"
data FCond
| Ogt "ogt"
| Oge "oge"
| Olt "olt"
| Ole "ole"
-- | Oeq "oeq"
-- | One "one"
data SwitchAlt | SwitchAlt TLit "" ", label %" "" lident
data Lit
| NmbrL number
| FalseL "false"
| TrueL "true"
| StringL "getelementptr inbounds ([" number "x i8 ]*" lident "" ", i32 0, i32 0)"
| VoidL
data TVar | TVar Type lident
data TLit | TLit Type Lit
data FieldT | FieldT uident "::" Type
data ConC | ConC uident Type
data Type
| PtrT Type "" "*"
| IntT "i" "" number
| FloatT "float"
| DoubleT "double"
| VoidT "void"
| FunT Type "(" TypeList ")"
| VarArgsT "..."
| UserT lident
| StructT "{" TypeList "}"
| ArrayT "[" number "x" Type "]"
| CharT "i8"
list ConCList ConC nonempty separator "|" horiz
list FieldTList FieldT nonempty separator "," horiz
list TypeList Type empty separator "," horiz
list ExpList Exp nonempty separator "," horiz
list AtomList Atom nonempty separator "," horiz
list TVarList TVar nonempty separator "," horiz
list SwitchAltList SwitchAlt empty terminator "" vert
list StmtList Stmt empty terminator "" vert
list DefineList Define empty terminator "" vert