Esempio n. 1
0
int main() {
	buildTools();
	Tokenizer tokenizer;
	char str[1024] = "z=1;p = func(){ z=2;};";
	//char str[1024] = "a;c;b = func(a){a=3;c=5;};if(a){b=3;}for(a=0;a<10;a++){b=3;}while(a>3)a--;do{a++;}while(a<10);";
	//str[0] = '\0';
	//str = "a=1;";


	Interpreter interpreter;
	ProgramBuilder builder;

	int length = 0;
	std::vector<Object*> programs;
	do {
		TokenList list;
		tokenizer.tokenize(str, list);
		//tokenizer.printList(list);
		Object* program = builder.buildProgram(list);

		if (program) {
			programs.push_back(program);

			builder.printProgram(program);

			const Object* object = program->firstChild;
			bool terminate = interpreter.interprete(program);
			if (terminate) {
				break;
			}
			if (object->nextSibling == nullptr) {
				if (object->firstChild && object->firstChild->objectType == Tt_value) {
					interpreter.printStackTop(builder);
				}
			}
			length = 0;

		} else {
			if (str[length] == '\0' || (str[length] == '\n' && str[length + 1] == '\0')) {
				length = 0;
			} else {
				length = strlen(str);
				str[length] = ' ';
				str[length + 1] = '\0';
				length++;
			}
		}
		if (length == 0) {
			printf(">> ");
		} else {
			printf(">>>> ");
		}
		fgets(str + length, sizeof(str), stdin);
	} while (feof(stdin) == false);

	for (unsigned i = 0; i < programs.size(); i++) {
		builder.deleteProgram(programs[i]);
	}
	builder.clear();
	interpreter.clear();
	return 0;
}