parser.cxx

changeset 7
118d3d5db64f
parent 3
08cab2b67dce
child 8
c8bfa7e6ae1b
equal deleted inserted replaced
6:0005527cad62 7:118d3d5db64f
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);
98 // Event definition 98 // Event definition
99 MustNext (); 99 MustNext ();
100 100
101 EventDef* e = FindEventByName (token); 101 EventDef* e = FindEventByName (token);
102 if (!e) 102 if (!e)
103 ParseError ("bad event! got `%s`\n", token.chars()); 103 ParserError ("bad event! got `%s`\n", token.chars());
104 104
105 MustNext ("{"); 105 MustNext ("{");
106 106
107 g_CurMode = MODE_EVENT; 107 g_CurMode = MODE_EVENT;
108 108
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

mercurial