2016-05-25 09:18:36 +08:00
|
|
|
//===-- BrainF.h - BrainF compiler class ------------------------*- C++ -*-===//
|
2007-09-13 02:24:00 +08:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-30 04:37:57 +08:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2007-09-13 02:24:00 +08:00
|
|
|
//
|
2016-05-25 09:18:36 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
2007-09-13 02:24:00 +08:00
|
|
|
//
|
|
|
|
// This class stores the data for the BrainF compiler so it doesn't have
|
|
|
|
// to pass all of it around. The main method is parse.
|
|
|
|
//
|
2016-05-25 09:18:36 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
2007-09-13 02:24:00 +08:00
|
|
|
|
|
|
|
#ifndef BRAINF_H
|
|
|
|
#define BRAINF_H
|
|
|
|
|
2013-01-02 19:56:33 +08:00
|
|
|
#include "llvm/IR/IRBuilder.h"
|
|
|
|
#include "llvm/IR/LLVMContext.h"
|
|
|
|
#include "llvm/IR/Module.h"
|
2016-05-25 09:18:36 +08:00
|
|
|
#include <istream>
|
2007-09-13 02:24:00 +08:00
|
|
|
|
|
|
|
using namespace llvm;
|
|
|
|
|
|
|
|
/// This class provides a parser for the BrainF language.
|
|
|
|
/// The class itself is made to store values during
|
|
|
|
/// parsing so they don't have to be passed around
|
|
|
|
/// as much.
|
|
|
|
class BrainF {
|
|
|
|
public:
|
|
|
|
/// Options for how BrainF should compile
|
|
|
|
enum CompileFlags {
|
|
|
|
flag_off = 0,
|
|
|
|
flag_arraybounds = 1
|
|
|
|
};
|
|
|
|
|
|
|
|
/// This is the main method. It parses BrainF from in1
|
|
|
|
/// and returns the module with a function
|
|
|
|
/// void brainf()
|
|
|
|
/// containing the resulting code.
|
|
|
|
/// On error, it calls abort.
|
|
|
|
/// The caller must delete the returned module.
|
2009-07-02 05:22:36 +08:00
|
|
|
Module *parse(std::istream *in1, int mem, CompileFlags cf,
|
2009-07-02 07:13:44 +08:00
|
|
|
LLVMContext& C);
|
2007-09-13 02:24:00 +08:00
|
|
|
|
|
|
|
protected:
|
|
|
|
/// The different symbols in the BrainF language
|
|
|
|
enum Symbol {
|
|
|
|
SYM_NONE,
|
|
|
|
SYM_READ,
|
|
|
|
SYM_WRITE,
|
|
|
|
SYM_MOVE,
|
|
|
|
SYM_CHANGE,
|
|
|
|
SYM_LOOP,
|
|
|
|
SYM_ENDLOOP,
|
|
|
|
SYM_EOF
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Names of the different parts of the language.
|
|
|
|
/// Tape is used for reading and writing the tape.
|
|
|
|
/// headreg is used for the position of the head.
|
|
|
|
/// label is used for the labels for the BasicBlocks.
|
|
|
|
/// testreg is used for testing the loop exit condition.
|
|
|
|
static const char *tapereg;
|
|
|
|
static const char *headreg;
|
|
|
|
static const char *label;
|
|
|
|
static const char *testreg;
|
|
|
|
|
|
|
|
/// Put the brainf function preamble and other fixed pieces of code
|
2009-07-02 07:13:44 +08:00
|
|
|
void header(LLVMContext& C);
|
2007-09-13 02:24:00 +08:00
|
|
|
|
|
|
|
/// The main loop for parsing. It calls itself recursively
|
|
|
|
/// to handle the depth of nesting of "[]".
|
2009-07-15 07:09:55 +08:00
|
|
|
void readloop(PHINode *phi, BasicBlock *oldbb,
|
|
|
|
BasicBlock *testbb, LLVMContext &Context);
|
2007-09-13 02:24:00 +08:00
|
|
|
|
|
|
|
/// Constants during parsing
|
|
|
|
int memtotal;
|
|
|
|
CompileFlags comflag;
|
|
|
|
std::istream *in;
|
|
|
|
Module *module;
|
|
|
|
Function *brainf_func;
|
|
|
|
Function *getchar_func;
|
|
|
|
Function *putchar_func;
|
|
|
|
Value *ptr_arr;
|
|
|
|
Value *ptr_arrmax;
|
|
|
|
BasicBlock *endbb;
|
|
|
|
BasicBlock *aberrorbb;
|
|
|
|
|
|
|
|
/// Variables
|
2008-08-09 03:39:37 +08:00
|
|
|
IRBuilder<> *builder;
|
2007-09-13 02:24:00 +08:00
|
|
|
Value *curhead;
|
|
|
|
};
|
|
|
|
|
2016-05-25 09:18:36 +08:00
|
|
|
#endif // BRAINF_H
|