src/Parser.cc

changeset 116
56ff19947607
parent 115
9be16e1c1e44
equal deleted inserted replaced
115:9be16e1c1e44 116:56ff19947607
34 #include "Lexer.h" 34 #include "Lexer.h"
35 #include "DataBuffer.h" 35 #include "DataBuffer.h"
36 #include "Expression.h" 36 #include "Expression.h"
37 37
38 #define SCOPE(n) (m_scopeStack[m_scopeCursor - n]) 38 #define SCOPE(n) (m_scopeStack[m_scopeCursor - n])
39
40 static const StringList g_validZandronumVersions = {"1.2", "1.3", "2.0"};
39 41
40 // ============================================================================ 42 // ============================================================================
41 // 43 //
42 BotscriptParser::BotscriptParser() : 44 BotscriptParser::BotscriptParser() :
43 m_isReadOnly (false), 45 m_isReadOnly (false),
51 m_isStateSpawnDefined (false), 53 m_isStateSpawnDefined (false),
52 m_gotMainLoop (false), 54 m_gotMainLoop (false),
53 m_scopeCursor (-1), 55 m_scopeCursor (-1),
54 m_isElseAllowed (false), 56 m_isElseAllowed (false),
55 m_highestGlobalVarIndex (0), 57 m_highestGlobalVarIndex (0),
56 m_highestStateVarIndex (0) {} 58 m_highestStateVarIndex (0),
59 m_zandronumVersion (10200), // 1.2
60 m_defaultZandronumVersion (true) {}
57 61
58 // ============================================================================ 62 // ============================================================================
59 // 63 //
60 BotscriptParser::~BotscriptParser() 64 BotscriptParser::~BotscriptParser()
61 { 65 {
173 case TK_Funcdef: 177 case TK_Funcdef:
174 parseFuncdef(); 178 parseFuncdef();
175 break; 179 break;
176 180
177 case TK_Semicolon: 181 case TK_Semicolon:
182 break;
183
184 case TK_Using:
185 parseUsing();
178 break; 186 break;
179 187
180 default: 188 default:
181 { 189 {
182 // Check if it's a command 190 // Check if it's a command
214 if (isReadOnly() == false) 222 if (isReadOnly() == false)
215 { 223 {
216 // stateSpawn must be defined! 224 // stateSpawn must be defined!
217 if (m_isStateSpawnDefined == false) 225 if (m_isStateSpawnDefined == false)
218 error ("script must have a state named `stateSpawn`!"); 226 error ("script must have a state named `stateSpawn`!");
227
228 if (m_defaultZandronumVersion)
229 {
230 print ("\n");
231 print ("note: use the 'using' directive to define a target Zandronum version\n");
232 print ("usage: using zandronum <version>, possible versions: %1\n", g_validZandronumVersions);
233 print ("\n");
234 }
219 235
220 // Dump the last state's onenter and mainloop 236 // Dump the last state's onenter and mainloop
221 writeMemberBuffers(); 237 writeMemberBuffers();
222 238
223 // String table 239 // String table
899 m_lexer->mustGetNext (TK_Semicolon); 915 m_lexer->mustGetNext (TK_Semicolon);
900 addCommandDefinition (comm); 916 addCommandDefinition (comm);
901 } 917 }
902 918
903 // ============================================================================ 919 // ============================================================================
920 //
921 // Parses a using statement
922 //
923 void BotscriptParser::parseUsing()
924 {
925 checkToplevel();
926 m_lexer->mustGetSymbol ("zandronum");
927 String versionText;
928
929 while (m_lexer->next() && (m_lexer->tokenType() == TK_Number || m_lexer->tokenType() == TK_Dot))
930 versionText += getTokenString();
931
932 // Note: at this point the lexer's pointing at the token after the version.
933 if (versionText.isEmpty())
934 error ("expected version string, got `%1`", getTokenString());
935 if (g_validZandronumVersions.contains (versionText) == false)
936 error ("unknown version string `%2`: valid versions: `%1`\n", g_validZandronumVersions, versionText);
937
938 StringList versionTokens = versionText.split (".");
939 m_zandronumVersion = versionTokens[0].toLong() * 10000 + versionTokens[1].toLong() * 100;
940 m_defaultZandronumVersion = false;
941 m_lexer->tokenMustBe (TK_Semicolon);
942 }
943
944 // ============================================================================/
945 //
904 // Parses a command call 946 // Parses a command call
947 //
905 DataBuffer* BotscriptParser::parseCommand (CommandInfo* comm) 948 DataBuffer* BotscriptParser::parseCommand (CommandInfo* comm)
906 { 949 {
907 DataBuffer* r = new DataBuffer (64); 950 DataBuffer* r = new DataBuffer (64);
908 951
909 if (m_currentMode == PARSERMODE_TopLevel && comm->returnvalue == TYPE_Void) 952 if (m_currentMode == PARSERMODE_TopLevel && comm->returnvalue == TYPE_Void)

mercurial