Gir uses two types of IR, with and without offsets Without offsets --------------- This is produced by `parse`. Each subsection shows the properties the command object of that type has in IR without offsets ### add property | value ---------|------ type | `add` value | The number to add to current cell Generated on `+` and `-` ### moveHead property | value ---------|------ type | `add` type | `moveHead` value | The number of steps to move the tape head right Generated on `<` and `>` ### writeByte property | value ---------|------ type | `writeByte` Generated on `.` ### readByte property | value ---------|------ type | `readByte` Generated on `,` ### loop property | value ---------|------ type | `loop` contents | An array of the commands making up the loop body Generated on `[`…`]` ### clear property | value ---------|------ type | `clear` Not generated by the parser directly, but generated by optimizations With offsets ------------ This is produced by the optimization pass `addOffsetProperties`. Each subsection shows the properties the command object of that type has in IR with offsets ### add property | value ---------|------ type | `add` value | The number to add to the cell offfset | The location of the cell relative to current tape position ### moveHead property | value ---------|------ type | `moveHead` value | The number of steps to move the tape head right ### writeByte property | value ---------|------ type | `writeByte` offset | The location of the cell relative to current tape position ### readByte property | value ---------|------ type | `readByte` offset | The location of the cell relative to current tape position ### loop property | value -----------|------ type | `loop` contents | An array of the commands making up the loop body isBalanced | Whether execution of the loop body ends in same cell it started in ### clear property | value ---------|------ type | `clear` offset | The location of the cell relative to current tape position