1 //===-- BrainF.h - BrainF compiler class ----------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by Sterling Stein and is distributed under the
6 // University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===--------------------------------------------------------------------===//
10 // This class stores the data for the BrainF compiler so it doesn't have
11 // to pass all of it around. The main method is parse.
13 //===--------------------------------------------------------------------===//
18 #include "llvm/Module.h"
19 #include "llvm/Support/LLVMBuilder.h"
23 /// This class provides a parser for the BrainF language.
24 /// The class itself is made to store values during
25 /// parsing so they don't have to be passed around
29 /// Options for how BrainF should compile
35 /// This is the main method. It parses BrainF from in1
36 /// and returns the module with a function
38 /// containing the resulting code.
39 /// On error, it calls abort.
40 /// The caller must delete the returned module.
41 Module *parse(std::istream *in1, int mem, CompileFlags cf);
44 /// The different symbols in the BrainF language
56 /// Names of the different parts of the language.
57 /// Tape is used for reading and writing the tape.
58 /// headreg is used for the position of the head.
59 /// label is used for the labels for the BasicBlocks.
60 /// testreg is used for testing the loop exit condition.
61 static const char *tapereg;
62 static const char *headreg;
63 static const char *label;
64 static const char *testreg;
66 /// Put the brainf function preamble and other fixed pieces of code
69 /// The main loop for parsing. It calls itself recursively
70 /// to handle the depth of nesting of "[]".
71 void readloop(PHINode *phi, BasicBlock *oldbb, BasicBlock *testbb);
73 /// Constants during parsing
78 Function *brainf_func;
79 Function *getchar_func;
80 Function *putchar_func;
84 BasicBlock *aberrorbb;