Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
01.05.2014
Размер:
1.17 Кб
Скачать
#ifndef POLIZINTERPRETER_HPP_
#define POLIZINTERPRETER_HPP_

#include <iostream>
#include <stack>

#include "Poliz.hpp"
#include "Errors.hpp"

namespace Parser_impl {


class PolizInterpreter{
	
	PolizProgram* progr;
	
	void invoke(int);
	
	std::stack<PolizInstruction> exec_stack;
	
	
	long double getValue(LookupTable<Variable>& local);
	
	ElementTypes getType(LookupTable<Variable>& local);
	
	void setValue(LookupTable<Variable>& local, long double);
	
	PolizInstruction getInstruction(InstType type);
	
	std::string getString();
	
public:
	
	PolizInterpreter(PolizProgram* program) : progr(program) {}
	
	int run()
	{
		try{
			
		invoke(progr->main);
		
		} catch (ParserException&){
			throw;
		} catch (int exit){
			return exit;
		} catch(...){
			throw RuntimeException("Abnormal program termination");
		}
		
		if (exec_stack.size()!=1)
			throw RuntimeException("Bad stack");
			
		PolizInstruction i = exec_stack.top();
		if (i.inst_type != TLiteral)
			throw RuntimeException("Bad stack");
					
		return int(exec_stack.top().value);
		
		
	}		
	
};


}

#endif /*POLIZINTERPRETER_HPP_*/
Соседние файлы в папке MyLanguage