Parsing the C Intermediate Language (CIL). CIL provides a manageable means to analyze and compile C code.
The common method to reduce C to CIL is to use the cilly driver:
cilly --merge --keepmerged { c-files-and-options }
- type Name = String
- data Type
- = Void
- | Array Int Type
- | Ptr Type
- | Volatile Type
- | Typedef Type
- | Struct [(Name, Type)]
- | Union [(Name, Type)]
- | Enum [(Name, Int)]
- | BitField Type [(Name, Int)]
- | StructRef Name
- | UnionRef Name
- | EnumRef Name
- | TypedefRef Name
- | Function Type [Type]
- | Int8
- | Int16
- | Int32
- | Word8
- | Word16
- | Word32
- | Float
- | Double
- data Stmt
- = Null
- | Compound [Name] [Stmt] Position
- | TypeDecl Name Type Position
- | VariableDef Name Type (Maybe Init) Position
- | FunctionDef Name Type [(Name, Type)] Stmt Position
- | Assign Expr Expr Position
- | StmtApply Apply Position
- | While Expr Stmt Position
- | If Expr Stmt Stmt Position
- | Return (Maybe Expr) Position
- | Goto Name Position
- | Break Position
- | Switch Expr Stmt Position
- | Case Expr Stmt Position
- | Default Stmt Position
- data Expr
- = ConstInt Int Position
- | ConstFloat Double Position
- | ConstChar Char Position
- | ConstString String Position
- | Var Name Position
- | Mul Expr Expr Position
- | Div Expr Expr Position
- | Rmd Expr Expr Position
- | Add Expr Expr Position
- | Sub Expr Expr Position
- | Shl Expr Expr Position
- | Shr Expr Expr Position
- | Lt Expr Expr Position
- | Gt Expr Expr Position
- | Le Expr Expr Position
- | Ge Expr Expr Position
- | Eq Expr Expr Position
- | Neq Expr Expr Position
- | And Expr Expr Position
- | Xor Expr Expr Position
- | Or Expr Expr Position
- | Adr Expr Position
- | Ind Expr Position
- | Minus Expr Position
- | Comp Expr Position
- | Neg Expr Position
- | Cast Type Expr Position
- | Index Expr Expr Position
- | ExprApply Apply Position
- | Mem Expr Name Position
- | MemInd Expr Name Position
- | SizeT Type Position
- | SizeE Expr Position
- data Init
- data Apply = Apply Expr [Expr]
- parseCIL :: String -> ByteString -> Stmt
- position :: Pos a => a -> String
Documentation
Types.
Void | |
Array Int Type | |
Ptr Type | |
Volatile Type | A volatile qualified type. |
Typedef Type | |
Struct [(Name, Type)] | |
Union [(Name, Type)] | |
Enum [(Name, Int)] | |
BitField Type [(Name, Int)] | |
StructRef Name | Reference to a struct type. |
UnionRef Name | Reference to a union type. |
EnumRef Name | Reference to an enum type. |
TypedefRef Name | Reference to a previously defined typedef. |
Function Type [Type] | |
Int8 | |
Int16 | |
Int32 | |
Word8 | |
Word16 | |
Word32 | |
Float | |
Double |
Statements.
Expressions.
ConstInt Int Position | |
ConstFloat Double Position | |
ConstChar Char Position | |
ConstString String Position | |
Var Name Position | Variable reference. |
Mul Expr Expr Position | a * b |
Div Expr Expr Position | a / b |
Rmd Expr Expr Position | a % b |
Add Expr Expr Position | a + b |
Sub Expr Expr Position | a - b |
Shl Expr Expr Position | a << b |
Shr Expr Expr Position | a >> b |
Lt Expr Expr Position | a < b |
Gt Expr Expr Position | a > b |
Le Expr Expr Position | a <= b |
Ge Expr Expr Position | a >= b |
Eq Expr Expr Position | a == b |
Neq Expr Expr Position | a != b |
And Expr Expr Position | a & b |
Xor Expr Expr Position | a ^ b |
Or Expr Expr Position | a | b |
Adr Expr Position | &a |
Ind Expr Position | *a |
Minus Expr Position | -a |
Comp Expr Position | ~a |
Neg Expr Position | !a |
Cast Type Expr Position | (...) a |
Index Expr Expr Position | a[b] |
ExprApply Apply Position | a(x, y, z) |
Mem Expr Name Position | a.name |
MemInd Expr Name Position | a->name |
SizeT Type Position | sizeof(type) |
SizeE Expr Position | sizeof(expr) |
parseCIL :: String -> ByteString -> StmtSource
Parses a merged CIL program, given a file name and contents.