#include "stdafx.h" #include #include #include #include #include #include #include "parser_edsl.h" enum TokType { END_OF_TEXT = 0, CE = 'c', AE = 'a', BE = 'b', DE = 'd', EE = 'e' }; //NTerm A = //Rule() << CE; // //NTerm B = //Rule() << CE; // //NTerm S = //Rule() << AE << A << DE //| Rule() << BE << B << BE //| Rule() << AE << B << EE //| Rule() << BE << A << EE; NTerm C = Rule() << CE << C | Rule() << DE; NTerm S = Rule() << C << C; //enum TokType { // END_OF_TEXT = 0, // PRINT, READ, VARNAME, NUMBER, STRING, // PLUS = '+', MUNUS = '-', MUL = '*', DIV = '/', SET = '=', // SEMICOLON = ';', COMMA = ',', LP = '(', RP = ')' //}; // //// <тип токена, возвращаемое значение функции (void, если функции нет)> //// Program //extern NTerm Operator; // //NTerm Program = //Rule() << Operator //| Rule() << Program << ';' << Operator; // // //// Operator //extern NTerm InputOperator, PrintOperator, AssignOperator; // //NTerm Operator = //Rule() << InputOperator //| Rule() << PrintOperator //| Rule() << AssignOperator; // // //// InputOperator //extern NTerm Variable; // //void input_func(double *variable) { // scanf("%lf", variable); //} // //NTerm InputOperator = //Rule() << READ << Variable << input_func //| Rule() << InputOperator << ',' << Variable << input_func; // // //// PrintOperator //extern NTerm Expression; // //void print_val_func(double value) { // printf("%f", value); //} // //void print_str_func(std::string str) { // printf("%s", str.c_str()); //} // //NTerm PrintOperator = //Rule() << PRINT << Expression << print_val_func //| Rule() << PRINT << Term(STRING) << print_str_func //| Rule() << PrintOperator << ',' << Expression << print_val_func //| Rule() << PrintOperator << ',' << Term(STRING) << print_str_func; // // //// AssignOperator //void assign_func(double *variable, double value) { // *variable = value; //} // //NTerm AssignOperator = //Rule() << Variable << '=' << Expression << assign_func; // // //// Variable //std::map variables; // //double *variable_func(std::string name) { // return &variables[name]; //} // //NTerm Variable = //Rule() << Term(VARNAME) << variable_func; // // //// Expression //extern NTerm ExprTerm; // Слагаемое // //double add_func(double x, double y) { // return x + y; //} // //double sub_func(double x, double y) { // return x - y; //} // //NTerm Expression = //Rule() << ExprTerm //| Rule() << Expression << '+' << ExprTerm << add_func //| Rule() << Expression << '-' << ExprTerm << sub_func; // // //// ExprTerm //extern NTerm Factor; // //double mul_func(double x, double y) { // return x * y; //} // //double div_func(double x, double y) { // return x / y; //} // //NTerm ExprTerm = //Rule() << Factor //| Rule() << ExprTerm << '*' << Factor << mul_func //| Rule() << ExprTerm << '/' << Factor << div_func; // // //// Factor //double deref_var_func(double *variable) { // return *variable; //} // //NTerm Factor = //Rule() << Term(NUMBER) //| Rule() << Variable << deref_var_func //| Rule() << LP << Expression << ')'; class MyLexer : public Lexer { int i = 0; char* buffer; public: MyLexer(char *input_file) { buffer = input_file; } Token *next_token() { Coord coord; coord.filename = "in.txt"; coord.line = 1; coord.col = 1; i++; switch (i) { case 1: return new Token(CE, coord); case 2: return new Token(DE, coord); case 3: return new Token(END_OF_TEXT, coord); /*case 1: return new AttrToken(VARNAME, "n", coord); case 2: return new AttrToken(NUMBER, 10, coord); break;*/ //return new Token((TokType)0, coord); } // /*return new Token(PRINT, coord); return new AttrToken(VARNAME, varname, coord); ... return new AttrToken(NUMBER, value, coord); ... return new Token(0, coord);*/ // Конец ввода всегда должен иметь значение 0 } }; // Основная программа int main(int argc, char *argv[]) { setlocale(LC_ALL, "RUS"); if (argc > 1) { //MyLexer lexer(argv[1]); //Program.parse(lexer); } else { std::ifstream file; file.open("C:\\Users\\Lenovo\\Documents\\Visual Studio 2013\\Projects\\ConsoleApplication1\\ConsoleApplication1\\in.txt", std::ios::in); if (file) { std::filebuf* pbuf = file.rdbuf(); std::size_t size = pbuf->pubseekoff(0, file.end, file.in); pbuf->pubseekpos(0, file.in); //std::cout << size << '\n'; char* buffer = new char(size); int p = sizeof(char); pbuf->sgetn(buffer, size); //std::cout.write(buffer, size); MyLexer lexer(buffer); //Variable.parse(lexer); S.parse(lexer); delete[] buffer; } else { std::cout << "Где файл? Нет файла." << '\n'; } } return 0; }