49 #include "events.h" |
49 #include "events.h" |
50 |
50 |
51 #define TOKEN_CHARS token.chars() |
51 #define TOKEN_CHARS token.chars() |
52 #define TOKEN_IS(s) !token.compare (s) |
52 #define TOKEN_IS(s) !token.compare (s) |
53 #define MUST_TOPLEVEL if (g_CurMode != MODE_TOPLEVEL) \ |
53 #define MUST_TOPLEVEL if (g_CurMode != MODE_TOPLEVEL) \ |
54 ParseError ("%ss may only be defined at top level!", token.chars()); |
54 ParserError ("%ss may only be defined at top level!", token.chars()); |
55 |
55 |
56 int g_NumStates = 0; |
56 int g_NumStates = 0; |
57 int g_NumEvents = 0; |
57 int g_NumEvents = 0; |
58 int g_CurMode = MODE_TOPLEVEL; |
58 int g_CurMode = MODE_TOPLEVEL; |
59 str g_CurState = ""; |
59 str g_CurState = ""; |
64 if (TOKEN_IS ("#include")) { |
64 if (TOKEN_IS ("#include")) { |
65 MustNext (); |
65 MustNext (); |
66 // First ensure that the file can be opened |
66 // First ensure that the file can be opened |
67 FILE* newfile = fopen (token.chars(), "r"); |
67 FILE* newfile = fopen (token.chars(), "r"); |
68 if (!newfile) |
68 if (!newfile) |
69 ParseError ("couldn't open included file `%s`!", token.chars()); |
69 ParserError ("couldn't open included file `%s`!", token.chars()); |
70 fclose (newfile); |
70 fclose (newfile); |
71 ScriptReader* newreader = new ScriptReader (token.chars()); |
71 ScriptReader* newreader = new ScriptReader (token.chars()); |
72 newreader->BeginParse (w); |
72 newreader->BeginParse (w); |
73 } else if (TOKEN_IS ("state")) { |
73 } else if (TOKEN_IS ("state")) { |
74 MUST_TOPLEVEL |
74 MUST_TOPLEVEL |
77 |
77 |
78 str statename = token; |
78 str statename = token; |
79 |
79 |
80 // State name must be a word. |
80 // State name must be a word. |
81 if (statename.first (" ") != statename.len()) |
81 if (statename.first (" ") != statename.len()) |
82 ParseError ("state name must be a single word! got `%s`", (char*)statename); |
82 ParserError ("state name must be a single word! got `%s`", (char*)statename); |
83 |
83 |
84 // Must end in a colon |
84 // Must end in a colon |
85 MustNext (":"); |
85 MustNext (":"); |
86 |
86 |
87 w->Write (DH_STATENAME); |
87 w->Write (DH_STATENAME); |
116 // Brace closes event. |
116 // Brace closes event. |
117 w->Write (DH_ENDEVENT); |
117 w->Write (DH_ENDEVENT); |
118 g_CurMode = MODE_TOPLEVEL; |
118 g_CurMode = MODE_TOPLEVEL; |
119 break; |
119 break; |
120 default: |
120 default: |
121 ParseError ("unexpected `}`"); |
121 ParserError ("unexpected `}`"); |
122 } |
122 } |
123 } else { |
123 } else { |
124 ParseError ("unknown keyword `%s`!", TOKEN_CHARS); |
124 ParserError ("unknown keyword `%s`!", TOKEN_CHARS); |
125 } |
125 } |
126 } |
126 } |
127 |
127 |
128 if (g_CurMode != MODE_TOPLEVEL) |
128 if (g_CurMode != MODE_TOPLEVEL) |
129 ParseError ("script did not end at top level! did you forget a `}`?\n"); |
129 ParserError ("script did not end at top level! did you forget a `}`?\n"); |
130 |
130 |
131 /* |
131 /* |
132 // State |
132 // State |
133 w->WriteState ("stateSpawn"); |
133 w->WriteState ("stateSpawn"); |
134 |
134 |