00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "config.h"
00021
00022 #include "builder.h"
00023 #include "parser.h"
00024 #include "scanner.h"
00025 #include "vm.h"
00026 #include "vypIO.h"
00027
00028 #ifndef BUILDING_DOX
00029 # include <string>
00030 # include <fstream>
00031 #endif
00032
00033 using namespace StreamDecorator;
00034 using std::string;
00035
00040 void printUsage(string path) {
00041 std::cout << "Usage: " << path << " INPUT_FILE_NAME" << std::endl;
00042 }
00043
00044 int main(int argc, char *argv[]) {
00045 #if CONSOLE_COLOR_OUTPUT
00046 Color::enable(true);
00047 #endif
00048 if (argc != 2) {
00049
00050 if (argc > 0)
00051 printUsage(argv[0]);
00052 return -1;
00053 }
00054 const string fileName(argv[1]);
00055 if (fileName == string("--help")) {
00056
00057 printUsage(argv[0]);
00058 return 0;
00059 }
00060
00061
00062 std::fstream input(fileName.c_str(), std::ios::in);
00063 if (!input) {
00064 std::cerr << Error(E_ERROR, fileName, "can't open file") << std::endl;
00065 return -1;
00066 }
00067
00068
00069 IScanner *scanner = ScannerFactory::createScanner(input, fileName);
00070
00071
00072 Vm *vm = new Vm(fileName);
00073 bool bOk = FncFactory::initVm(vm);
00074
00075
00076 IBuilder *builder = BuilderFactory::createBuilder(vm);
00077
00078
00079 bOk &= (0 == Parser::parse(scanner, builder, fileName));
00080 bOk &= !(scanner -> hasError());
00081 bOk &= !(builder -> hasError());
00082
00083
00084 VmRunner *vmRunner = 0;
00085 if (bOk) {
00086 vmRunner = new VmRunner(vm);
00087 bOk &= !(vmRunner -> hasError());
00088 }
00089
00090 if (!bOk)
00091 std::cerr << Error(E_NOTE, fileName, "unable to run program, fix the error(s) above") << std::endl;
00092 else {
00093
00094 if (!vmRunner -> run()) {
00095 bOk = false;
00096 std::cerr << Error(E_NOTE, fileName, "runtime error(s) detected") << std::endl;
00097 }
00098 }
00099
00100
00101 delete vmRunner;
00102 delete builder;
00103 delete vm;
00104 delete scanner;
00105
00106
00107 input.close();
00108
00109
00110 return bOk ? 0 : -1;
00111 }
00112