int main (int argc, const char** argv) { std::string expression; while (1) { std::cout << "> "; input_expression (expression); if (expression.empty ()) { continue; } //std::cout << expression << std::endl; CMD_EXIST (expression); Parser_Init (expression.data()); Parse(); if (Error_Happened ()) { continue; } if (!parse_assigned_active) std::cout << Parse_Result() << std::endl; } }
void Parser_test() { char s[] = "a2b1c0(e1f1g)0h0(i1j)1k"; printf("%s\n", s); Parser p; Parser_Init(&p, s, 0x00, 0); Parser_analyze(&p); getchar(); }
void Interpreter_Init(Interpreter *pinterpreter, LPCSTR name, List *pflist) { memset(pinterpreter, 0, sizeof(Interpreter)); StackedSymbolTable_Init(&(pinterpreter->theSymbolTable), name); Parser_Init(&(pinterpreter->theParser)); pinterpreter->ptheFunctionList = pflist; List_Init(&(pinterpreter->theImportList)); List_Init(&(pinterpreter->theInstructionList)); List_Init(&(pinterpreter->paramList)); Stack_Init(&(pinterpreter->theDataStack)); Stack_Init(&(pinterpreter->theLabelStack)); pp_context_init(&(pinterpreter->theContext)); }
Symbol Formula(Symbol* text, Symbol ends) { symbol_init(); ///s_Parser_analyze = Parser_analyze; #ifdef PARSER_DEBUG Parser_test(); return 0x00; #else Parser p; Parser_Init(&p, text, ends, 0); return Parser_analyze(&p); #endif }
Result Parser_operate(Parser* _self, Symbol previous_operator_symbol) { Symbol left_symbol = _self->text[_self->symbol_count]; Symbol operator_symbol = _self->text[_self->symbol_count + 1]; Result ret; ret.operator_symbol = operator_symbol; ret.return_value = _self->end_symbol; ///if (operator_symbol == _self->end_symbol) if (symbol_compare(operator_symbol, _self->end_symbol) == 0) { _self->symbol_count++; ret.return_value = left_symbol; return ret; } ret.return_value = alloc_symbol(); Symbol right_symbol = _self->text[_self->symbol_count + 2]; ///if (right_symbol == '(') if (symbol_compare(right_symbol, s_left_parentheses) == 0) { Parser p; ///Parser_Init(&p, _self->text, ')', _self->symbol_count + 3); Parser_Init(&p, _self->text, s_right_parentheses, _self->symbol_count + 3); right_symbol = Parser_analyze(&p); _self->symbol_count = p.symbol_count; _self->text[_self->symbol_count] = right_symbol; } else _self->symbol_count += 2; Symbol next_operator_symbol = _self->text[_self->symbol_count + 1]; ///if (next_operator_symbol == _self->end_symbol || symbol_compare(operator_symbol, next_operator_symbol) <= 0) if (symbol_compare(next_operator_symbol, _self->end_symbol) == 0 || symbol_compare(operator_symbol, next_operator_symbol) <= 0) { _self->text[_self->symbol_count] = ret.return_value; #ifdef PARSER_DEBUG printf("%c = %c %c %c prev %c\n", ret.return_value, left_symbol, operator_symbol, right_symbol, previous_operator_symbol); #endif return ret; } else { Result r = Parser_operate(_self, operator_symbol); Symbol n = _self->text[_self->symbol_count + 1]; ///if (n == _self->end_symbol || symbol_compare(previous_operator_symbol, n) <= 0) if (symbol_compare(n, _self->end_symbol) == 0 || symbol_compare(previous_operator_symbol, n) <= 0) { #ifdef PARSER_DEBUG printf("%c = %c %c %c prev %c\n", ret.return_value, left_symbol, operator_symbol, r.return_value, previous_operator_symbol); #endif return ret; } else { r = Parser_operate(_self, previous_operator_symbol); #ifdef PARSER_DEBUG printf("%c = %c %c %c prev %c\n", ret.return_value, left_symbol, operator_symbol, r.return_value, previous_operator_symbol); #endif return ret; } } }