#ifndef SYN_ANALYZER_HEADER
#define SYN_ANALYZER_HEADER

#include "LexAnalyzer.h"
#include "GameBot.h"
#include <cstdio>
#include "String.h"
#include "Poliz.h"

class SynAnalyzer
{
private:
	Interpreter *interpreter;
	void append(PolizElement* element) {interpreter->Append(element);}
	
	LexAnalyzer lex;
	LexAnalyzer::Lexem current;
	void nextLexem();
	
	void readStatement();
	void readCall();
	void readArgs();
	void readExpression();
	void readAndOp();	
	void readBoolOp();
	void readSumOp();
	void readTerm();
	void readPrimary();
	void readVar();
	
public:
	SynAnalyzer(FILE *source, Interpreter *interpreter);
	~SynAnalyzer();
	
	void Analyze();
	
	class SyntaxError
	{
	private:
		String message;
		unsigned line;
	public:
		SyntaxError(const String& message, const unsigned line)
		{
			this->message = message;
			this->line = line;
		}
		inline const String& GetMessage() const {return message;}
		inline unsigned GetLine() const {return line;}
	};
};

#endif
