예제 #1
0
파일: main.cpp 프로젝트: Blzhismy/Toys
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;
	}
}
예제 #2
0
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();
}
예제 #3
0
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));
}
예제 #4
0
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
}
예제 #5
0
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;
        }
    }
}