73 void BotscriptParser::ParseBotscript (String fileName) |
73 void BotscriptParser::ParseBotscript (String fileName) |
74 { |
74 { |
75 // Lex and preprocess the file |
75 // Lex and preprocess the file |
76 mLexer->ProcessFile (fileName); |
76 mLexer->ProcessFile (fileName); |
77 |
77 |
|
78 mMainBuffer = new DataBuffer; |
|
79 mOnEnterBuffer = new DataBuffer; |
|
80 mMainLoopBuffer = new DataBuffer; |
78 mCurrentMode = ETopLevelMode; |
81 mCurrentMode = ETopLevelMode; |
79 mNumStates = 0; |
82 mNumStates = 0; |
80 mNumEvents = 0; |
83 mNumEvents = 0; |
81 mScopeCursor = 0; |
84 mScopeCursor = 0; |
82 mStateSpawnDefined = false; |
85 mStateSpawnDefined = false; |
866 |
869 |
867 if (FindGlobalVariable (labelName)) |
870 if (FindGlobalVariable (labelName)) |
868 Error ("label name `%1` conflicts with variable\n", labelName); |
871 Error ("label name `%1` conflicts with variable\n", labelName); |
869 |
872 |
870 // See if a mark already exists for this label |
873 // See if a mark already exists for this label |
871 for (UndefinedLabel& undf : mUndefinedLabels) |
874 for (UndefinedLabel& label : mUndefinedLabels) |
872 { |
875 { |
873 if (undf.name != labelName) |
876 if (label.name != labelName) |
874 continue; |
877 continue; |
875 |
878 |
876 mark = undf.target; |
879 mark = label.target; |
877 buffer()->AdjustMark (mark); |
880 buffer()->AdjustMark (mark); |
878 |
881 |
879 // No longer undefined |
882 // No longer undefined |
880 mUndefinedLabels.Remove (undf); |
883 mUndefinedLabels.Remove (label); |
881 break; |
884 break; |
882 } |
885 } |
883 |
886 |
884 // Not found in unmarked lists, define it now |
887 // Not found in unmarked lists, define it now |
885 if (mark == null) |
888 if (mark == null) |
912 CommandInfo* comm = new CommandInfo; |
915 CommandInfo* comm = new CommandInfo; |
913 |
916 |
914 // Number |
917 // Number |
915 mLexer->MustGetNext (tkNumber); |
918 mLexer->MustGetNext (tkNumber); |
916 comm->number = mLexer->GetToken()->text.ToLong(); |
919 comm->number = mLexer->GetToken()->text.ToLong(); |
917 |
|
918 mLexer->MustGetNext (tkColon); |
920 mLexer->MustGetNext (tkColon); |
919 |
921 |
920 // Name |
922 // Name |
921 mLexer->MustGetNext (tkSymbol); |
923 mLexer->MustGetNext (tkSymbol); |
922 comm->name = mLexer->GetToken()->text; |
924 comm->name = mLexer->GetToken()->text; |
923 |
|
924 mLexer->MustGetNext (tkColon); |
925 mLexer->MustGetNext (tkColon); |
925 |
926 |
926 // Return value |
927 // Return value |
927 mLexer->MustGetAnyOf ({tkInt, tkVoid, tkBool, tkStr}); |
928 mLexer->MustGetAnyOf ({tkInt, tkVoid, tkBool, tkStr}); |
928 comm->returnvalue = GetTypeByName (mLexer->GetToken()->text); // TODO |
929 comm->returnvalue = GetTypeByName (mLexer->GetToken()->text); // TODO |
929 assert (comm->returnvalue != -1); |
930 assert (comm->returnvalue != -1); |
930 |
|
931 mLexer->MustGetNext (tkColon); |
931 mLexer->MustGetNext (tkColon); |
932 |
932 |
933 // Num args |
933 // Num args |
934 mLexer->MustGetNext (tkNumber); |
934 mLexer->MustGetNext (tkNumber); |
935 comm->numargs = mLexer->GetToken()->text.ToLong(); |
935 comm->numargs = mLexer->GetToken()->text.ToLong(); |
936 |
|
937 mLexer->MustGetNext (tkColon); |
936 mLexer->MustGetNext (tkColon); |
938 |
937 |
939 // Max args |
938 // Max args |
940 mLexer->MustGetNext (tkNumber); |
939 mLexer->MustGetNext (tkNumber); |
941 comm->maxargs = mLexer->GetToken()->text.ToLong(); |
940 comm->maxargs = mLexer->GetToken()->text.ToLong(); |