BrainF.h revision 0a08460599eed603e469e3e16d0cf6aa33b8ba93
16264bc6bd486a321c375cf852e6c9041eb49be7bJohnny Chen//===-- BrainF.h - BrainF compiler class ----------------------*- C++ -*-===// 26264bc6bd486a321c375cf852e6c9041eb49be7bJohnny Chen// 36264bc6bd486a321c375cf852e6c9041eb49be7bJohnny Chen// The LLVM Compiler Infrastructure 4535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen// 5535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen// This file is distributed under the University of Illinois Open Source 6535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen// License. See LICENSE.TXT for details. 7535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen// 8535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen//===--------------------------------------------------------------------===// 9535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen// 10535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen// This class stores the data for the BrainF compiler so it doesn't have 11535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen// to pass all of it around. The main method is parse. 12535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen// 13535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen//===--------------------------------------------------------------------===// 14535960ee92f58617fdcc016d75c49ddf650517dfJohnny Chen 156264bc6bd486a321c375cf852e6c9041eb49be7bJohnny Chen#ifndef BRAINF_H 16#define BRAINF_H 17 18#include "llvm/IR/IRBuilder.h" 19#include "llvm/IR/LLVMContext.h" 20#include "llvm/IR/Module.h" 21 22using namespace llvm; 23 24/// This class provides a parser for the BrainF language. 25/// The class itself is made to store values during 26/// parsing so they don't have to be passed around 27/// as much. 28class BrainF { 29 public: 30 /// Options for how BrainF should compile 31 enum CompileFlags { 32 flag_off = 0, 33 flag_arraybounds = 1 34 }; 35 36 /// This is the main method. It parses BrainF from in1 37 /// and returns the module with a function 38 /// void brainf() 39 /// containing the resulting code. 40 /// On error, it calls abort. 41 /// The caller must delete the returned module. 42 Module *parse(std::istream *in1, int mem, CompileFlags cf, 43 LLVMContext& C); 44 45 protected: 46 /// The different symbols in the BrainF language 47 enum Symbol { 48 SYM_NONE, 49 SYM_READ, 50 SYM_WRITE, 51 SYM_MOVE, 52 SYM_CHANGE, 53 SYM_LOOP, 54 SYM_ENDLOOP, 55 SYM_EOF 56 }; 57 58 /// Names of the different parts of the language. 59 /// Tape is used for reading and writing the tape. 60 /// headreg is used for the position of the head. 61 /// label is used for the labels for the BasicBlocks. 62 /// testreg is used for testing the loop exit condition. 63 static const char *tapereg; 64 static const char *headreg; 65 static const char *label; 66 static const char *testreg; 67 68 /// Put the brainf function preamble and other fixed pieces of code 69 void header(LLVMContext& C); 70 71 /// The main loop for parsing. It calls itself recursively 72 /// to handle the depth of nesting of "[]". 73 void readloop(PHINode *phi, BasicBlock *oldbb, 74 BasicBlock *testbb, LLVMContext &Context); 75 76 /// Constants during parsing 77 int memtotal; 78 CompileFlags comflag; 79 std::istream *in; 80 Module *module; 81 Function *brainf_func; 82 Function *getchar_func; 83 Function *putchar_func; 84 Value *ptr_arr; 85 Value *ptr_arrmax; 86 BasicBlock *endbb; 87 BasicBlock *aberrorbb; 88 89 /// Variables 90 IRBuilder<> *builder; 91 Value *curhead; 92}; 93 94#endif 95