BrainF.h revision fc001bbfc360ab828e5a4b0cbe4bb7db87361b85
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===-- BrainF.h - BrainF compiler class ----------------------*- C++ -*-===// 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The LLVM Compiler Infrastructure 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This file is distributed under the University of Illinois Open Source 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// License. See LICENSE.TXT for details. 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===--------------------------------------------------------------------===// 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class stores the data for the BrainF compiler so it doesn't have 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// to pass all of it around. The main method is parse. 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//===--------------------------------------------------------------------===// 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#ifndef BRAINF_H 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define BRAINF_H 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "llvm/Module.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "llvm/Support/LLVMBuilder.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using namespace llvm; 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// This class provides a parser for the BrainF language. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// The class itself is made to store values during 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// parsing so they don't have to be passed around 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// as much. 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class BrainF { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// Options for how BrainF should compile 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) enum CompileFlags { 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) flag_off = 0, 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) flag_arraybounds = 1 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// This is the main method. It parses BrainF from in1 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// and returns the module with a function 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// void brainf() 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// containing the resulting code. 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// On error, it calls abort. 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// The caller must delete the returned module. 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Module *parse(std::istream *in1, int mem, CompileFlags cf); 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// The different symbols in the BrainF language 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) enum Symbol { 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SYM_NONE, 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SYM_READ, 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SYM_WRITE, 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SYM_MOVE, 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SYM_CHANGE, 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SYM_LOOP, 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SYM_ENDLOOP, 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SYM_EOF 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// Names of the different parts of the language. 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// Tape is used for reading and writing the tape. 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// headreg is used for the position of the head. 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// label is used for the labels for the BasicBlocks. 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// testreg is used for testing the loop exit condition. 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static const char *tapereg; 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static const char *headreg; 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static const char *label; 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static const char *testreg; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// Put the brainf function preamble and other fixed pieces of code 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void header(); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// The main loop for parsing. It calls itself recursively 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// to handle the depth of nesting of "[]". 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void readloop(PHINode *phi, BasicBlock *oldbb, BasicBlock *testbb); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// Constants during parsing 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int memtotal; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CompileFlags comflag; 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::istream *in; 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Module *module; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Function *brainf_func; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Function *getchar_func; 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Function *putchar_func; 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Value *ptr_arr; 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Value *ptr_arrmax; 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BasicBlock *endbb; 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BasicBlock *aberrorbb; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// Variables 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LLVMBuilder *builder; 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Value *curhead; 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)