src/Parser.cc

changeset 116
56ff19947607
parent 115
9be16e1c1e44
--- a/src/Parser.cc	Mon Mar 03 01:04:16 2014 +0200
+++ b/src/Parser.cc	Mon Mar 03 01:47:39 2014 +0200
@@ -37,6 +37,8 @@
 
 #define SCOPE(n) (m_scopeStack[m_scopeCursor - n])
 
+static const StringList g_validZandronumVersions = {"1.2", "1.3", "2.0"};
+
 // ============================================================================
 //
 BotscriptParser::BotscriptParser() :
@@ -53,7 +55,9 @@
 	m_scopeCursor (-1),
 	m_isElseAllowed (false),
 	m_highestGlobalVarIndex (0),
-	m_highestStateVarIndex (0) {}
+	m_highestStateVarIndex (0),
+	m_zandronumVersion (10200), // 1.2
+	m_defaultZandronumVersion (true) {}
 
 // ============================================================================
 //
@@ -177,6 +181,10 @@
 			case TK_Semicolon:
 				break;
 
+			case TK_Using:
+				parseUsing();
+				break;
+
 			default:
 			{
 				// Check if it's a command
@@ -217,6 +225,14 @@
 		if (m_isStateSpawnDefined == false)
 			error ("script must have a state named `stateSpawn`!");
 
+		if (m_defaultZandronumVersion)
+		{
+			print ("\n");
+			print ("note: use the 'using' directive to define a target Zandronum version\n");
+			print ("usage: using zandronum <version>, possible versions: %1\n", g_validZandronumVersions);
+			print ("\n");
+		}
+
 		// Dump the last state's onenter and mainloop
 		writeMemberBuffers();
 
@@ -901,7 +917,34 @@
 }
 
 // ============================================================================
+//
+// Parses a using statement
+//
+void BotscriptParser::parseUsing()
+{
+	checkToplevel();
+	m_lexer->mustGetSymbol ("zandronum");
+	String versionText;
+
+	while (m_lexer->next() && (m_lexer->tokenType() == TK_Number || m_lexer->tokenType() == TK_Dot))
+		versionText += getTokenString();
+
+	// Note: at this point the lexer's pointing at the token after the version.
+	if (versionText.isEmpty())
+		error ("expected version string, got `%1`", getTokenString());
+	if (g_validZandronumVersions.contains (versionText) == false)
+		error ("unknown version string `%2`: valid versions: `%1`\n", g_validZandronumVersions, versionText);
+
+	StringList versionTokens = versionText.split (".");
+	m_zandronumVersion = versionTokens[0].toLong() * 10000 + versionTokens[1].toLong() * 100;
+	m_defaultZandronumVersion = false;
+	m_lexer->tokenMustBe (TK_Semicolon);
+}
+
+// ============================================================================/
+//
 // Parses a command call
+//
 DataBuffer* BotscriptParser::parseCommand (CommandInfo* comm)
 {
 	DataBuffer* r = new DataBuffer (64);

mercurial