src/parser.h

changeset 88
5def6ff8b466
parent 87
8f65914e7046
child 89
029a330a9bef
--- a/src/parser.h	Sun Feb 02 01:50:23 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,260 +0,0 @@
-/*
-	Copyright 2012-2014 Santeri Piippo
-	All rights reserved.
-
-	Redistribution and use in source and binary forms, with or without
-	modification, are permitted provided that the following conditions
-	are met:
-
-	1. Redistributions of source code must retain the above copyright
-	   notice, this list of conditions and the following disclaimer.
-	2. Redistributions in binary form must reproduce the above copyright
-	   notice, this list of conditions and the following disclaimer in the
-	   documentation and/or other materials provided with the distribution.
-	3. The name of the author may not be used to endorse or promote products
-	   derived from this software without specific prior written permission.
-
-	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-	IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-	OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-	DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-	THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-	THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef BOTC_PARSER_H
-#define BOTC_PARSER_H
-
-#include <stdio.h>
-#include "main.h"
-#include "commands.h"
-#include "lexer_scanner.h"
-#include "tokens.h"
-
-#define MAX_SCOPE 32
-#define MAX_CASE 64
-#define MAX_MARKS 512 // TODO: get rid of this
-
-class data_buffer;
-class lexer;
-class script_variable;
-
-struct undefined_label
-{
-	string		name;
-	byte_mark*	target;
-};
-
-// ============================================================================
-// Operators
-//
-enum operator_e
-{
-	OPER_ADD,
-	OPER_SUBTRACT,
-	OPER_MULTIPLY,
-	OPER_DIVIDE,
-	OPER_MODULUS,
-	OPER_ASSIGN,
-	OPER_ASSIGNADD,
-	OPER_ASSIGNSUB,
-	OPER_ASSIGNMUL,
-	OPER_ASSIGNDIV,
-	OPER_ASSIGNMOD, // -- 10
-	OPER_EQUALS,
-	OPER_NOTEQUALS,
-	OPER_LESSTHAN,
-	OPER_GREATERTHAN,
-	OPER_LESSTHANEQUALS,
-	OPER_GREATERTHANEQUALS,
-	OPER_LEFTSHIFT,
-	OPER_RIGHTSHIFT,
-	OPER_ASSIGNLEFTSHIFT,
-	OPER_ASSIGNRIGHTSHIFT, // -- 20
-	OPER_OR,
-	OPER_AND,
-	OPER_BITWISEOR,
-	OPER_BITWISEAND,
-	OPER_BITWISEEOR,
-	OPER_TERNARY,
-	OPER_STRLEN,
-};
-
-// ============================================================================
-//
-struct operator_info
-{
-	operator_e		opercode;
-	e_data_header	dataheader;
-	e_token			token;
-};
-
-// ============================================================================
-// Mark types
-//
-enum marktype_e
-{
-	e_label_mark,
-	e_if_mark,
-	e_internal_mark, // internal structures
-};
-
-// ============================================================================
-// Scope types
-//
-enum scopetype_e
-{
-	e_unknown_scope,
-	e_if_scope,
-	e_while_scope,
-	e_for_scope,
-	e_do_scope,
-	e_switch_scope,
-	e_else_scope,
-};
-
-// ============================================================================
-// Meta-data about scopes
-//
-struct ScopeInfo
-{
-	byte_mark*		mark1;
-	byte_mark*		mark2;
-	scopetype_e		type;
-	data_buffer*	buffer1;
-
-	// switch-related stuff
-	// Which case are we at?
-	int				casecursor;
-
-	// Marks to case-blocks
-	byte_mark*		casemarks[MAX_CASE];
-
-	// Numbers of the case labels
-	int				casenumbers[MAX_CASE];
-
-	// actual case blocks
-	data_buffer*	casebuffers[MAX_CASE];
-
-	// What is the current buffer of the block?
-	data_buffer*	recordbuffer;
-};
-
-// ============================================================================
-//
-struct constant_info
-{
-	string name;
-	type_e type;
-	string val;
-};
-
-// ============================================================================
-//
-class botscript_parser
-{
-	public:
-		// ====================================================================
-		// METHODS
-		botscript_parser();
-		~botscript_parser();
-		void			parse_botscript (string file_name);
-		data_buffer*	parse_command (command_info* comm);
-		data_buffer*	parse_expression (type_e reqtype);
-		data_buffer*	parse_assignment (script_variable* var);
-		int				parse_operator (bool peek = false);
-		data_buffer*	parse_expr_value (type_e reqtype);
-		string			parse_float();
-		void			push_scope();
-		data_buffer*	parse_statement();
-		void			add_switch_case (data_buffer* b);
-		void			check_toplevel();
-		void			check_not_toplevel();
-		bool			token_is (e_token a);
-		string			token_string();
-		string			describe_position() const;
-		void			write_to_file (string outfile);
-
-		inline int get_num_events() const
-		{
-			return m_num_events;
-		}
-
-		inline int get_num_states() const
-		{
-			return m_num_states;
-		}
-
-	private:
-		// The lexer we're using.
-		lexer*					m_lx;
-
-		// The main buffer - the contents of this is what we
-		// write to file after parsing is complete
-		data_buffer*			m_main_buffer;
-
-		// onenter buffer - the contents of the onenter{} block
-		// is buffered here and is merged further at the end of state
-		data_buffer*			m_on_enter_buffer;
-
-		// Mainloop buffer - the contents of the mainloop{} block
-		// is buffered here and is merged further at the end of state
-		data_buffer*			m_main_loop_buffer;
-
-		// Switch buffer - switch case data is recorded to this
-		// buffer initially, instead of into main buffer.
-		data_buffer*			m_switch_buffer;
-
-		int						m_num_states;
-		int						m_num_events;
-		parsermode_e			m_current_mode;
-		string					m_current_state;
-		bool					m_state_spawn_defined;
-		bool					m_got_main_loop;
-		int						m_scope_cursor;
-		data_buffer*			m_if_expression;
-		bool					m_can_else;
-		list<undefined_label>	m_undefined_labels;
-		list<constant_info>		m_constants;
-
-		// How many bytes have we written to file?
-		int				m_num_written_bytes;
-
-		// Scope data
-		// TODO: make a list
-		ScopeInfo		m_scope_stack[MAX_SCOPE];
-
-		data_buffer*	buffer();
-		constant_info*	find_constant (const string& tok);
-		void			parse_state_block();
-		void			parse_event_block();
-		void			parse_mainloop();
-		void			parse_on_enter_exit();
-		void			parse_variable_declaration();
-		void			parse_goto();
-		void			parse_if();
-		void			parse_else();
-		void			parse_while_block();
-		void			parse_for_block();
-		void			parse_do_block();
-		void			parse_switch_block();
-		void			parse_switch_case();
-		void			parse_switch_default();
-		void			parse_break();
-		void			parse_continue();
-		void			parse_block_end();
-		void			parse_const();
-		void			parse_label();
-		void			parse_eventdef();
-		void			parse_funcdef();
-		void			write_member_buffers();
-		void			write_string_table();
-};
-
-constant_info* find_constant (const string& tok);
-
-#endif // BOTC_PARSER_H

mercurial