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)