cplusplus17.Examples/examples/ScanLex/main.cpp
Source: cplusplus17.Examples/examples/ScanLex/main.cpp
#include "scan_lex.hpp"
#include "scan_html.hpp"
#include "parser.hpp"
#include "parser_ast.hpp"
#include<fstream>
int main(int argc, char **argv) {
if(argc == 1) {
while(1) {
try {
std::cout << "=)> ";
std::string text;
std::getline(std::cin, text);
scan::Scanner scanner(text);
scanner.scan();
scanner.print();
} catch(scan::ScanException &e) {
std::cerr << e.error() << "\n";
}
}
} else if(argc == 2) {
try {
char *buf;
std::fstream file;
file.open(argv[1], std::ios::in);
if(!file.is_open()) {
std::cerr << argv[0] << ": could not open file: " << argv[1] << "\n";
return -1;
}
file.seekg(0, std::ios::end);
unsigned int len = file.tellg();
file.seekg(0, std::ios::beg);
buf = new char [len + 1];
file.read(buf, len);
buf[len] = 0;
std::string text = buf;
delete [] buf;
scan::Scanner scanner(text);
scanner.scan();
scanner.print();
scanner.crunch(std::cout);
}
catch(scan::ScanException &e) {
std::cerr << e.error() << "\n";
}
} else if(argc == 3 && std::string(argv[2]) != "-u" && std::string(argv[2]) != "-h") {
try {
char *buf;
std::fstream file;
file.open(argv[1], std::ios::in);
if(!file.is_open()) {
std::cerr << argv[0] << ": could not open file: " << argv[1] << "\n";
return -1;
}
file.seekg(0, std::ios::end);
unsigned int len = file.tellg();
file.seekg(0, std::ios::beg);
buf = new char [len + 1];
file.read(buf, len);
buf[len] = 0;
std::string text = buf;
delete [] buf;
scan::Scanner scanner(text);
scanner.scan();
// scanner.print();
std::fstream out;
out.open(argv[2], std::ios::out | std::ios::binary);
if(!out.is_open()) {
std::cerr << argv[0] << ": could not open output file.\n";
return -1;
}
parse::Parser parser(&scanner);
if(parser.checkSyntax()) {
std::cout << "Succeded..\n";
scanner.reset();
crunch(&scanner, out);
std::cout << argv[0] << ": " << argv[2] << "\n";
} else {
std::cout << "Parsing failed..\n";
out.close();
return -1;
}
out.close();
}
catch(scan::ScanException &e) {
std::cerr << e.error() << "\n";
}
} else if(argc == 3 && std::string(argv[2]) == "-u") {
std::fstream file;
file.open(argv[1], std::ios::in | std::ios::binary);
if(!file.is_open()) {
std::cerr << argv[0] << "could not open file...\n";
return -1;
}
parse::AST ast(&file);
if(ast.scan()) {
file.close();
ast.buildTree();
ast.buildCode();
ast.printBackend(std::cout);
ast.run();
} else {
std::cerr << "Invalid file format...\n";
}
return 0;
}
else if(argc == 3 && std::string(argv[2]) == "-h") {
std::fstream file;
file.open(argv[1], std::ios::in | std::ios::binary);
if(!file.is_open()) {
std::cerr << argv[0] << "could not open file...\n";
return -1;
}
scan::procHTML(file, std::cout);
file.close();
}
return 0;
}