#ifndef __NASAL_FUNCTIONAL_H__
#define __NASAL_FUNCTIONAL_H__

#include "nasal_var.h"

//for function
#define FUNC_BEGIN       0
#define FUNC_OPERATOR    1
#define FUNC_IDENTIFIER  2
#define FUNC_NUMBER      3
#define FUNC_RESERVEWORD 4
#define FUNC_STRING      5

//for token and lexer
#define OPERATOR    1 //界符 or 运算符 
#define IDENTIFIER  2 //自定义标识符 
#define NUMBER      3 //数字 
#define RESERVEWORD 4 //关键字 
#define STRING      5 //字符串类型 

struct token_unit
{
	int type;
	std::string content;
	int line;
	token_unit *next;
};

struct parameter
{
	std::string var_name;
	var param_var;
	parameter *next;
};

class func
{
	private:
		token_unit *statement_head;
		parameter *parameter_head;
	public:
		func();
		func(const func&);
		~func();
		func& operator=(const func&);
		void append_var(std::string&,var&);
		void append_token(const int,const int,std::string &);
		void print_info();
};

class token_list
{
	private:
		token_unit *head;
		int list_range;
	public:
		token_list();
		~token_list();
		token_unit* get_head();
		int get_list_range();
		void print_line_token(const int);
		void delete_all();
		void append(const int,const int,std::string&);
		void print();
};

token_list nasal_lexer;

struct parse_unit
{
	int type;
	std::string content;
	int line;
};

class parse
{
	private:
		parse_unit *content_array;
		parse_unit *statement;
		int len;
	public:
		parse();
		~parse();
		void content_array_set_empty();
		void statement_set_empty();
		void brace_check();
		bool def_function();
		bool def_array();
		bool def_hash();
		bool def_scalar();
		bool asi_function();
		bool asi_array();
		bool asi_hash();
		bool asi_scalar();
		void definition();
		void assignment();
		void total_run(token_list&);
};

#endif
