src/Parser.cc

changeset 89
029a330a9bef
parent 88
5def6ff8b466
child 91
427eb377d53e
equal deleted inserted replaced
88:5def6ff8b466 89:029a330a9bef
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();

mercurial