mini_c.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 122 行

CPP
122
字号
/*=============================================================================    Copyright (c) 2001-2007 Joel de Guzman    Distributed under the Boost Software License, Version 1.0. (See accompanying    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)=============================================================================*////////////////////////////////////////////////////////////////////////////////////  Not a calculator anymore, right? :-)////  [ JDG April 10, 2007 ]       spirit2/////////////////////////////////////////////////////////////////////////////////#include "mini_c.hpp"/////////////////////////////////////////////////////////////////////////////////  Our main compiler///////////////////////////////////////////////////////////////////////////////template <typename Grammar>bool compile(Grammar const& prog, std::string const& expr){    typedef white_space<std::string::const_iterator> white_space;    white_space ws; //  Our skipper    std::string::const_iterator iter = expr.begin();    std::string::const_iterator end = expr.end();    bool r = phrase_parse(iter, end, prog, ws);    if (r && iter == end)    {        std::cout << "-------------------------\n";        std::cout << "Parsing succeeded\n";        std::cout << "-------------------------\n";        return true;    }    else    {        std::cout << "-------------------------\n";        std::cout << "Parsing failed\n";        std::cout << "-------------------------\n";        return false;    }}/////////////////////////////////////////////////////////////////////////////////  Main program///////////////////////////////////////////////////////////////////////////////int main(int argc, char **argv){    char const* filename;    if (argc > 1)    {        filename = argv[1];    }    else    {        std::cerr << "Error: No input file provided." << std::endl;        return 1;    }    std::ifstream in(filename, std::ios_base::in);    if (!in)    {        std::cerr << "Error: Could not open input file: "            << filename << std::endl;        return 1;    }    std::string source_code; // We will read the contents here.    in.unsetf(std::ios::skipws); // No white space skipping!    std::copy(        std::istream_iterator<char>(in),        std::istream_iterator<char>(),        std::back_inserter(source_code));    typedef std::string::const_iterator iterator_type;    typedef program<iterator_type> program;    vmachine mach;              //  Our virtual machine    std::vector<int> code;      //  Our VM code    program prog(code);         //  Our grammar definition    if (::compile(prog, source_code))    {        std::string fmain("main");        std::string::iterator fbegin = fmain.begin();        function_info* f = prog.functions.lookup()->find(fbegin, fmain.end());        if (f == 0)        {            std::cerr << "Error: main function not defined" << std::endl;            return 1;        }        int nargs = argc-2;        if (f->arity != nargs)        {            std::cerr << "Error: main function requires " << f->arity << " arguments." << std::endl;            std::cerr << nargs << "supplied." << std::endl;            return 1;        }        for (int i = 0; i < nargs; ++i)            mach.stack[i] = boost::lexical_cast<int>(argv[i+2]);        int r = mach.execute(            code                                // code          , code.begin() + f->address           // pc          , mach.stack.begin()                  // frame_ptr        );        std::cout << "-------------------------\n";        std::cout << "Result: " << r << std::endl;        std::cout << "-------------------------\n\n";    }    std::cout << "Bye... :-) \n\n";    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?