src/Parser.cc

changeset 110
7a7a53f1d51b
parent 108
6409ece8297c
child 111
87d9ebd3ef34
--- a/src/Parser.cc	Wed Feb 12 06:33:16 2014 +0200
+++ b/src/Parser.cc	Wed Feb 12 06:50:13 2014 +0200
@@ -93,92 +93,92 @@
 	while (mLexer->GetNext())
 	{
 		// Check if else is potentically valid
-		if (TokenIs (tkElse) && mCanElse == false)
+		if (TokenIs (TK_Else) && mCanElse == false)
 			Error ("else without preceding if");
 
-		if (TokenIs (tkElse) == false)
+		if (TokenIs (TK_Else) == false)
 			mCanElse = false;
 
 		switch (mLexer->GetToken()->type)
 		{
-			case tkState:
+			case TK_State:
 				ParseStateBlock();
 				break;
 
-			case tkEvent:
+			case TK_Event:
 				ParseEventBlock();
 				break;
 
-			case tkMainloop:
+			case TK_Mainloop:
 				ParseMainloop();
 				break;
 
-			case tkOnenter:
-			case tkOnexit:
+			case TK_Onenter:
+			case TK_Onexit:
 				ParseOnEnterExit();
 				break;
 
-			case tkVar:
+			case TK_Var:
 				ParseVar();
 				break;
 
-			case tkGoto:
+			case TK_Goto:
 				ParseGoto();
 				break;
 
-			case tkIf:
+			case TK_If:
 				ParseIf();
 				break;
 
-			case tkElse:
+			case TK_Else:
 				ParseElse();
 				break;
 
-			case tkWhile:
+			case TK_While:
 				ParseWhileBlock();
 				break;
 
-			case tkFor:
+			case TK_For:
 				ParseForBlock();
 				break;
 
-			case tkDo:
+			case TK_Do:
 				ParseDoBlock();
 				break;
 
-			case tkSwitch:
+			case TK_Switch:
 				ParseSwitchBlock();
 				break;
 
-			case tkCase:
+			case TK_Case:
 				ParseSwitchCase();
 				break;
 
-			case tkDefault:
+			case TK_Default:
 				ParseSwitchDefault();
 				break;
 
-			case tkBreak:
+			case TK_Break:
 				ParseBreak();
 				break;
 
-			case tkContinue:
+			case TK_Continue:
 				ParseContinue();
 				break;
 
-			case tkBraceEnd:
+			case TK_BraceEnd:
 				ParseBlockEnd();
 				break;
 
-			case tkEventdef:
+			case TK_Eventdef:
 				ParseEventdef();
 				break;
 
-			case tkFuncdef:
+			case TK_Funcdef:
 				ParseFuncdef();
 				break;
 
-			case tkSemicolon:
+			case TK_Semicolon:
 				break;
 
 			default:
@@ -186,9 +186,9 @@
 				// Check for labels
 				Lexer::Token next;
 
-				if (TokenIs (tkSymbol) &&
+				if (TokenIs (TK_Symbol) &&
 					mLexer->PeekNext (&next) &&
-					next.type == tkColon)
+					next.type ==TK_Colon)
 				{
 					ParseLabel();
 					break;
@@ -200,7 +200,7 @@
 				if (comm)
 				{
 					buffer()->MergeAndDestroy (ParseCommand (comm));
-					mLexer->MustGetNext (tkSemicolon);
+					mLexer->MustGetNext (TK_Semicolon);
 					continue;
 				}
 
@@ -215,7 +215,7 @@
 				}
 
 				buffer()->MergeAndDestroy (b);
-				mLexer->MustGetNext (tkSemicolon);
+				mLexer->MustGetNext (TK_Semicolon);
 				break;
 			}
 		}
@@ -256,7 +256,7 @@
 void BotscriptParser::ParseStateBlock()
 {
 	CheckToplevel();
-	mLexer->MustGetNext (tkString);
+	mLexer->MustGetNext (TK_String);
 	String statename = GetTokenString();
 
 	// State name must be a word.
@@ -269,7 +269,7 @@
 		mStateSpawnDefined = true;
 
 	// Must end in a colon
-	mLexer->MustGetNext (tkColon);
+	mLexer->MustGetNext (TK_Colon);
 
 	// write the previous state's onenter and
 	// mainloop buffers to file now
@@ -291,14 +291,14 @@
 void BotscriptParser::ParseEventBlock()
 {
 	CheckToplevel();
-	mLexer->MustGetNext (tkString);
+	mLexer->MustGetNext (TK_String);
 
 	EventDefinition* e = FindEventByName (GetTokenString());
 
 	if (e == null)
 		Error ("bad event, got `%1`\n", GetTokenString());
 
-	mLexer->MustGetNext (tkBraceStart);
+	mLexer->MustGetNext (TK_BraceStart);
 	mCurrentMode = PARSERMODE_Event;
 	buffer()->WriteDWord (DH_Event);
 	buffer()->WriteDWord (e->number);
@@ -310,7 +310,7 @@
 void BotscriptParser::ParseMainloop()
 {
 	CheckToplevel();
-	mLexer->MustGetNext (tkBraceStart);
+	mLexer->MustGetNext (TK_BraceStart);
 
 	mCurrentMode = PARSERMODE_MainLoop;
 	mMainLoopBuffer->WriteDWord (DH_MainLoop);
@@ -321,8 +321,8 @@
 void BotscriptParser::ParseOnEnterExit()
 {
 	CheckToplevel();
-	bool onenter = (TokenIs (tkOnenter));
-	mLexer->MustGetNext (tkBraceStart);
+	bool onenter = (TokenIs (TK_Onenter));
+	mLexer->MustGetNext (TK_BraceStart);
 
 	mCurrentMode = onenter ? PARSERMODE_Onenter : PARSERMODE_Onexit;
 	buffer()->WriteDWord (onenter ? DH_OnEnter : DH_OnExit);
@@ -335,19 +335,19 @@
 	Variable* var = new Variable;
 	var->origin = mLexer->DescribeCurrentPosition();
 	var->isarray = false;
-	const bool isconst = mLexer->GetNext (tkConst);
-	mLexer->MustGetAnyOf ({tkInt, tkStr, tkVoid});
+	const bool isconst = mLexer->GetNext (TK_Const);
+	mLexer->MustGetAnyOf ({TK_Int,TK_Str,TK_Void});
 
-	DataType vartype =	(TokenIs (tkInt)) ? TYPE_Int :
-					(TokenIs (tkStr)) ? TYPE_String :
+	DataType vartype =	(TokenIs (TK_Int)) ? TYPE_Int :
+					(TokenIs (TK_Str)) ? TYPE_String :
 					TYPE_Bool;
 
-	mLexer->MustGetNext (tkSymbol);
+	mLexer->MustGetNext (TK_Symbol);
 	String name = GetTokenString();
 
-	if (mLexer->GetNext (tkBracketStart))
+	if (mLexer->GetNext (TK_BracketStart))
 	{
-		mLexer->MustGetNext (tkBracketEnd);
+		mLexer->MustGetNext (TK_BracketEnd);
 		var->isarray = true;
 
 		if (isconst)
@@ -371,7 +371,7 @@
 	}
 	else
 	{
-		mLexer->MustGetNext (tkAssign);
+		mLexer->MustGetNext (TK_Assign);
 		Expression expr (this, mLexer, vartype);
 
 		// If the expression was constexpr, we know its value and thus
@@ -409,7 +409,7 @@
 		SCOPE(0).localVariables << var;
 
 	SuggestHighestVarIndex (IsInGlobalState(), var->index);
-	mLexer->MustGetNext (tkSemicolon);
+	mLexer->MustGetNext (TK_Semicolon);
 	Print ("Declared %3 variable #%1 $%2\n", var->index, var->name, IsInGlobalState() ? "global" : "state-local");
 }
 
@@ -420,7 +420,7 @@
 	CheckNotToplevel();
 
 	// Get the name of the label
-	mLexer->MustGetNext (tkSymbol);
+	mLexer->MustGetNext (TK_Symbol);
 
 	// Find the mark this goto statement points to
 	String target = GetTokenString();
@@ -438,7 +438,7 @@
 	// Add a reference to the mark.
 	buffer()->WriteDWord (DH_Goto);
 	buffer()->AddReference (mark);
-	mLexer->MustGetNext (tkSemicolon);
+	mLexer->MustGetNext (TK_Semicolon);
 }
 
 // ============================================================================
@@ -449,14 +449,14 @@
 	PushScope();
 
 	// Condition
-	mLexer->MustGetNext (tkParenStart);
+	mLexer->MustGetNext (TK_ParenStart);
 
 	// Read the expression and write it.
 	DataBuffer* c = ParseExpression (TYPE_Int);
 	buffer()->MergeAndDestroy (c);
 
-	mLexer->MustGetNext (tkParenEnd);
-	mLexer->MustGetNext (tkBraceStart);
+	mLexer->MustGetNext (TK_ParenEnd);
+	mLexer->MustGetNext (TK_BraceStart);
 
 	// Add a mark - to here temporarily - and add a reference to it.
 	// Upon a closing brace, the mark will be adjusted.
@@ -477,7 +477,7 @@
 void BotscriptParser::ParseElse()
 {
 	CheckNotToplevel();
-	mLexer->MustGetNext (tkBraceStart);
+	mLexer->MustGetNext (TK_BraceStart);
 	PushScope (eNoReset);
 
 	if (SCOPE (0).type != SCOPE_If)
@@ -511,10 +511,10 @@
 	ByteMark* mark2 = buffer()->AddMark (""); // end
 
 	// Condition
-	mLexer->MustGetNext (tkParenStart);
+	mLexer->MustGetNext (TK_ParenStart);
 	DataBuffer* expr = ParseExpression (TYPE_Int);
-	mLexer->MustGetNext (tkParenEnd);
-	mLexer->MustGetNext (tkBraceStart);
+	mLexer->MustGetNext (TK_ParenEnd);
+	mLexer->MustGetNext (TK_BraceStart);
 
 	// write condition
 	buffer()->MergeAndDestroy (expr);
@@ -537,13 +537,13 @@
 	PushScope();
 
 	// Initializer
-	mLexer->MustGetNext (tkParenStart);
+	mLexer->MustGetNext (TK_ParenStart);
 	DataBuffer* init = ParseStatement();
 
 	if (init == null)
 		Error ("bad statement for initializer of for");
 
-	mLexer->MustGetNext (tkSemicolon);
+	mLexer->MustGetNext (TK_Semicolon);
 
 	// Condition
 	DataBuffer* cond = ParseExpression (TYPE_Int);
@@ -551,7 +551,7 @@
 	if (cond == null)
 		Error ("bad statement for condition of for");
 
-	mLexer->MustGetNext (tkSemicolon);
+	mLexer->MustGetNext (TK_Semicolon);
 
 	// Incrementor
 	DataBuffer* incr = ParseStatement();
@@ -559,8 +559,8 @@
 	if (incr == null)
 		Error ("bad statement for incrementor of for");
 
-	mLexer->MustGetNext (tkParenEnd);
-	mLexer->MustGetNext (tkBraceStart);
+	mLexer->MustGetNext (TK_ParenEnd);
+	mLexer->MustGetNext (TK_BraceStart);
 
 	// First, write out the initializer
 	buffer()->MergeAndDestroy (init);
@@ -587,7 +587,7 @@
 {
 	CheckNotToplevel();
 	PushScope();
-	mLexer->MustGetNext (tkBraceStart);
+	mLexer->MustGetNext (TK_BraceStart);
 	SCOPE (0).mark1 = buffer()->AddMark ("");
 	SCOPE (0).type = SCOPE_Do;
 }
@@ -611,10 +611,10 @@
 
 	CheckNotToplevel();
 	PushScope();
-	mLexer->MustGetNext (tkParenStart);
+	mLexer->MustGetNext (TK_ParenStart);
 	buffer()->MergeAndDestroy (ParseExpression (TYPE_Int));
-	mLexer->MustGetNext (tkParenEnd);
-	mLexer->MustGetNext (tkBraceStart);
+	mLexer->MustGetNext (TK_ParenEnd);
+	mLexer->MustGetNext (TK_BraceStart);
 	SCOPE (0).type = SCOPE_Switch;
 	SCOPE (0).mark1 = buffer()->AddMark (""); // end mark
 	SCOPE (0).buffer1 = null; // default header
@@ -630,9 +630,9 @@
 
 	// Get a literal value for the case block. Zandronum does not support
 	// expressions here.
-	mLexer->MustGetNext (tkNumber);
+	mLexer->MustGetNext (TK_Number);
 	int num = mLexer->GetToken()->text.ToLong();
-	mLexer->MustGetNext (tkColon);
+	mLexer->MustGetNext (TK_Colon);
 
 	for (const CaseInfo& info : SCOPE(0).cases)
 		if (info.number == num)
@@ -665,7 +665,7 @@
 	if (SCOPE (0).buffer1 != null)
 		Error ("multiple default labels in one switch");
 
-	mLexer->MustGetNext (tkColon);
+	mLexer->MustGetNext (TK_Colon);
 
 	// The default header is buffered into buffer1, since
 	// it has to be the last of the case headers
@@ -712,14 +712,14 @@
 		} break;
 	}
 
-	mLexer->MustGetNext (tkSemicolon);
+	mLexer->MustGetNext (TK_Semicolon);
 }
 
 // ============================================================================
 //
 void BotscriptParser::ParseContinue()
 {
-	mLexer->MustGetNext (tkSemicolon);
+	mLexer->MustGetNext (TK_Semicolon);
 
 	int curs;
 	bool found = false;
@@ -792,11 +792,11 @@
 
 			case SCOPE_Do:
 			{
-				mLexer->MustGetNext (tkWhile);
-				mLexer->MustGetNext (tkParenStart);
+				mLexer->MustGetNext (TK_While);
+				mLexer->MustGetNext (TK_ParenStart);
 				DataBuffer* expr = ParseExpression (TYPE_Int);
-				mLexer->MustGetNext (tkParenEnd);
-				mLexer->MustGetNext (tkSemicolon);
+				mLexer->MustGetNext (TK_ParenEnd);
+				mLexer->MustGetNext (TK_Semicolon);
 
 				// If the condition runs true, go back to the start.
 				buffer()->MergeAndDestroy (expr);
@@ -861,7 +861,7 @@
 	// the closing data headers into said buffers too.
 	buffer()->WriteDWord (dataheader);
 	mCurrentMode = PARSERMODE_TopLevel;
-	mLexer->GetNext (tkSemicolon);
+	mLexer->GetNext (TK_Semicolon);
 }
 
 // ============================================================================
@@ -890,7 +890,7 @@
 	if (mark == null)
 		buffer()->AddMark (labelName);
 
-	mLexer->MustGetNext (tkColon);
+	mLexer->MustGetNext (TK_Colon);
 }
 
 // =============================================================================
@@ -899,14 +899,14 @@
 {
 	EventDefinition* e = new EventDefinition;
 
-	mLexer->MustGetNext (tkNumber);
+	mLexer->MustGetNext (TK_Number);
 	e->number = GetTokenString().ToLong();
-	mLexer->MustGetNext (tkColon);
-	mLexer->MustGetNext (tkSymbol);
+	mLexer->MustGetNext (TK_Colon);
+	mLexer->MustGetNext (TK_Symbol);
 	e->name = mLexer->GetToken()->text;
-	mLexer->MustGetNext (tkParenStart);
-	mLexer->MustGetNext (tkParenEnd);
-	mLexer->MustGetNext (tkSemicolon);
+	mLexer->MustGetNext (TK_ParenStart);
+	mLexer->MustGetNext (TK_ParenEnd);
+	mLexer->MustGetNext (TK_Semicolon);
 	AddEvent (e);
 }
 
@@ -918,47 +918,47 @@
 	comm->origin = mLexer->DescribeCurrentPosition();
 
 	// Return value
-	mLexer->MustGetAnyOf ({tkInt, tkVoid, tkBool, tkStr});
+	mLexer->MustGetAnyOf ({TK_Int,TK_Void,TK_Bool,TK_Str});
 	comm->returnvalue = GetTypeByName (mLexer->GetToken()->text); // TODO
 	assert (comm->returnvalue != -1);
 
 	// Number
-	mLexer->MustGetNext (tkNumber);
+	mLexer->MustGetNext (TK_Number);
 	comm->number = mLexer->GetToken()->text.ToLong();
-	mLexer->MustGetNext (tkColon);
+	mLexer->MustGetNext (TK_Colon);
 
 	// Name
-	mLexer->MustGetNext (tkSymbol);
+	mLexer->MustGetNext (TK_Symbol);
 	comm->name = mLexer->GetToken()->text;
 
 	// Arguments
-	mLexer->MustGetNext (tkParenStart);
+	mLexer->MustGetNext (TK_ParenStart);
 	comm->minargs = 0;
 
-	while (mLexer->PeekNextType (tkParenEnd) == false)
+	while (mLexer->PeekNextType (TK_ParenEnd) == false)
 	{
 		if (comm->args.IsEmpty() == false)
-			mLexer->MustGetNext (tkComma);
+			mLexer->MustGetNext (TK_Comma);
 
 		CommandArgument arg;
-		mLexer->MustGetAnyOf ({tkInt, tkBool, tkStr});
+		mLexer->MustGetAnyOf ({TK_Int,TK_Bool,TK_Str});
 		DataType type = GetTypeByName (mLexer->GetToken()->text); // TODO
 		assert (type != -1 && type != TYPE_Void);
 		arg.type = type;
 
-		mLexer->MustGetNext (tkSymbol);
+		mLexer->MustGetNext (TK_Symbol);
 		arg.name = mLexer->GetToken()->text;
 
 		// If this is an optional parameter, we need the default value.
-		if (comm->minargs < comm->args.Size() || mLexer->PeekNextType (tkAssign))
+		if (comm->minargs < comm->args.Size() || mLexer->PeekNextType (TK_Assign))
 		{
-			mLexer->MustGetNext (tkAssign);
+			mLexer->MustGetNext (TK_Assign);
 
 			switch (type)
 			{
 				case TYPE_Int:
 				case TYPE_Bool:
-					mLexer->MustGetNext (tkNumber);
+					mLexer->MustGetNext (TK_Number);
 					break;
 
 				case TYPE_String:
@@ -977,8 +977,8 @@
 		comm->args << arg;
 	}
 
-	mLexer->MustGetNext (tkParenEnd);
-	mLexer->MustGetNext (tkSemicolon);
+	mLexer->MustGetNext (TK_ParenEnd);
+	mLexer->MustGetNext (TK_Semicolon);
 	AddCommandDefinition (comm);
 }
 
@@ -991,14 +991,14 @@
 	if (mCurrentMode == PARSERMODE_TopLevel && comm->returnvalue == TYPE_Void)
 		Error ("command call at top level");
 
-	mLexer->MustGetNext (tkParenStart);
-	mLexer->MustGetNext (tkAny);
+	mLexer->MustGetNext (TK_ParenStart);
+	mLexer->MustGetNext (TK_Any);
 
 	int curarg = 0;
 
 	for (;;)
 	{
-		if (TokenIs (tkParenEnd))
+		if (TokenIs (TK_ParenEnd))
 		{
 			if (curarg < comm->minargs)
 				Error ("too few arguments passed to %1\n\tusage is: %2",
@@ -1012,25 +1012,25 @@
 				comm->name, comm->GetSignature());
 
 		r->MergeAndDestroy (ParseExpression (comm->args[curarg].type, true));
-		mLexer->MustGetNext (tkAny);
+		mLexer->MustGetNext (TK_Any);
 
 		if (curarg < comm->minargs - 1)
 		{
-			mLexer->TokenMustBe (tkComma);
-			mLexer->MustGetNext (tkAny);
+			mLexer->TokenMustBe (TK_Comma);
+			mLexer->MustGetNext (TK_Any);
 		}
 		else if (curarg < comm->args.Size() - 1)
 		{
 			// Can continue, but can terminate as well.
-			if (TokenIs (tkParenEnd))
+			if (TokenIs (TK_ParenEnd))
 			{
 				curarg++;
 				break;
 			}
 			else
 			{
-				mLexer->TokenMustBe (tkComma);
-				mLexer->MustGetNext (tkAny);
+				mLexer->TokenMustBe (TK_Comma);
+				mLexer->MustGetNext (TK_Any);
 			}
 		}
 
@@ -1056,15 +1056,15 @@
 //
 String BotscriptParser::ParseFloat()
 {
-	mLexer->TokenMustBe (tkNumber);
+	mLexer->TokenMustBe (TK_Number);
 	String floatstring = GetTokenString();
 	Lexer::Token tok;
 
 	// Go after the decimal point
-	if (mLexer->PeekNext (&tok) && tok.type == tkDot)
+	if (mLexer->PeekNext (&tok) && tok.type ==TK_Dot)
 	{
 		mLexer->Skip();
-		mLexer->MustGetNext (tkNumber);
+		mLexer->MustGetNext (TK_Number);
 		floatstring += ".";
 		floatstring += GetTokenString();
 	}
@@ -1078,30 +1078,30 @@
 //
 AssignmentOperator BotscriptParser::ParseAssignmentOperator()
 {
-	const List<EToken> tokens =
+	const List<TokenType> tokens =
 	{
-		tkAssign,
-		tkAddAssign,
-		tkSubAssign,
-		tkMultiplyAssign,
-		tkDivideAssign,
-		tkModulusAssign,
-		tkDoublePlus,
-		tkDoubleMinus,
+		TK_Assign,
+		TK_AddAssign,
+		TK_SubAssign,
+		TK_MultiplyAssign,
+		TK_DivideAssign,
+		TK_ModulusAssign,
+		TK_DoublePlus,
+		TK_DoubleMinus,
 	};
 
 	mLexer->MustGetAnyOf (tokens);
 
 	switch (mLexer->GetTokenType())
 	{
-		case tkAssign:			return ASSIGNOP_Assign;
-		case tkAddAssign:		return ASSIGNOP_Add;
-		case tkSubAssign:		return ASSIGNOP_Subtract;
-		case tkMultiplyAssign:	return ASSIGNOP_Multiply;
-		case tkDivideAssign:	return ASSIGNOP_Divide;
-		case tkModulusAssign:	return ASSIGNOP_Modulus;
-		case tkDoublePlus:		return ASSIGNOP_Increase;
-		case tkDoubleMinus:		return ASSIGNOP_Decrease;
+		case TK_Assign:			return ASSIGNOP_Assign;
+		case TK_AddAssign:		return ASSIGNOP_Add;
+		case TK_SubAssign:		return ASSIGNOP_Subtract;
+		case TK_MultiplyAssign:	return ASSIGNOP_Multiply;
+		case TK_DivideAssign:	return ASSIGNOP_Divide;
+		case TK_ModulusAssign:	return ASSIGNOP_Modulus;
+		case TK_DoublePlus:		return ASSIGNOP_Increase;
+		case TK_DoubleMinus:	return ASSIGNOP_Decrease;
 		default: break;
 	}
 
@@ -1167,11 +1167,11 @@
 
 	if (var->isarray)
 	{
-		mLexer->MustGetNext (tkBracketStart);
+		mLexer->MustGetNext (TK_BracketStart);
 		Expression expr (this, mLexer, TYPE_Int);
 		expr.GetResult()->ConvertToBuffer();
 		arrayindex = expr.GetResult()->GetBuffer()->Clone();
-		mLexer->MustGetNext (tkBracketEnd);
+		mLexer->MustGetNext (TK_BracketEnd);
 	}
 
 	// Get an operator
@@ -1264,9 +1264,9 @@
 DataBuffer* BotscriptParser::ParseStatement()
 {
 	// If it's a variable, expect assignment.
-	if (mLexer->GetNext (tkDollarSign))
+	if (mLexer->GetNext (TK_DollarSign))
 	{
-		mLexer->MustGetNext (tkSymbol);
+		mLexer->MustGetNext (TK_Symbol);
 		Variable* var = FindVariable (GetTokenString());
 
 		if (var == null)
@@ -1305,7 +1305,7 @@
 
 // ============================================================================
 //
-bool BotscriptParser::TokenIs (EToken a)
+bool BotscriptParser::TokenIs (TokenType a)
 {
 	return (mLexer->GetTokenType() == a);
 }

mercurial