2002-01-31 Duncan Mak <duncan@ximian.com>
[mono.git] / mcs / mcs / mb-parser.jay
1 %{\r
2 //\r
3 // MonoBASIC.Parser.cs (from .jay): The Parser for the MonoBASIC compiler\r
4 //\r
5 // Author: A Rafael D Teixeira (rafaelteixeirabr@hotmail.com)\r
6 //\r
7 // Licensed under the terms of the GNU GPL\r
8 //\r
9 // Copyright (C) 2001 A Rafael D Teixeira\r
10 //\r
11 // TODO:\r
12 //      Nearly everything\r
13 //\r
14 \r
15 namespace Mono.Languages.MonoBASIC\r
16 {\r
17         using System.Text;\r
18         using System;\r
19         using System.Collections;\r
20         \r
21         using CIR;\r
22         using Mono.Languages;\r
23         using Mono.Languages.MonoBASIC; // To get the tokenizer\r
24 \r
25         /// <summary>\r
26         ///    The MonoBASIC Parser\r
27         /// </summary>\r
28         public class Parser : GenericParser {\r
29                 Namespace     current_namespace;\r
30                 TypeContainer current_container;\r
31         \r
32 /*\r
33                 /// <summary>\r
34                 ///   Current block is used to add statements as we find\r
35                 ///   them.  \r
36                 /// </summary>\r
37                 Block      current_block;\r
38 \r
39                 /// <summary>\r
40                 ///   Current interface is used by the various declaration\r
41                 ///   productions in the interface declaration to "add"\r
42                 ///   the interfaces as we find them.\r
43                 /// </summary>\r
44                 Interface  current_interface;\r
45 \r
46                 /// <summary>\r
47                 ///   This is used by the unary_expression code to resolve\r
48                 ///   a name against a parameter.  \r
49                 /// </summary>\r
50                 Parameters current_local_parameters;\r
51 \r
52                 /// <summary>\r
53                 ///   Using during property parsing to describe the implicit\r
54                 ///   value parameter that is passed to the "set" accessor\r
55                 ///   method\r
56                 /// </summary>\r
57                 Parameter [] implicit_value_parameters;\r
58 \r
59 */\r
60                 /// <summary>\r
61                 ///   Used to record all types defined\r
62                 /// </summary>\r
63                 Tree tree;\r
64                 \r
65                 bool UseExtendedSyntax; // for ".mbs" files\r
66 \r
67                 public override string[] GetExtensions()\r
68                 {\r
69                         string [] list = { ".vb", ".mbs" };\r
70                         return list;\r
71                 }\r
72 \r
73 %}\r
74 \r
75 %token EOF\r
76 %token NONE   /* This token is never returned by our lexer */\r
77 %token ERROR  // This is used not by the parser, but by the tokenizer.\r
78               // do not remove.\r
79 \r
80 /*\r
81  *These are the MonoBASIC keywords\r
82  */\r
83 %token ADDHANDLER\r
84 %token ADDRESSOF\r
85 %token ALIAS\r
86 %token AND\r
87 %token ANDALSO\r
88 %token ANSI\r
89 %token AS\r
90 %token ASSEMBLY\r
91 %token AUTO\r
92 %token BOOLEAN  \r
93 %token BYREF\r
94 %token BYTE\r
95 %token BYVAL    \r
96 %token CALL\r
97 %token CASE     \r
98 %token CATCH    \r
99 %token CBOOL\r
100 %token CBYTE\r
101 %token CCHAR    \r
102 %token CDATE\r
103 %token CDEC\r
104 %token CDBL\r
105 %token CHAR     \r
106 %token CINT\r
107 %token CLASS\r
108 %token CLNG\r
109 %token COBJ\r
110 //%token COMPARE        \r
111 %token CONST    \r
112 %token CSHORT   \r
113 %token CSNG\r
114 %token CSTR\r
115 %token CTYPE\r
116 %token DATE\r
117 %token DECIMAL  \r
118 %token DECLARE\r
119 %token DEFAULT  \r
120 %token DELEGATE \r
121 %token DIM\r
122 %token DO       \r
123 %token DOUBLE   \r
124 %token EACH     \r
125 %token ELSE\r
126 %token ELSEIF\r
127 %token END      \r
128 %token ENUM     \r
129 %token EOL\r
130 %token ERASE\r
131 %token ERROR\r
132 %token EVENT\r
133 %token EXIT     \r
134 //%token EXPLICIT       \r
135 %token FALSE    \r
136 %token FINALLY  \r
137 %token FOR      \r
138 %token FRIEND\r
139 %token FUNCTION\r
140 %token GET\r
141 %token GETTYPE\r
142 %token GOTO     \r
143 %token HANDLES\r
144 %token IF       \r
145 %token IMPLEMENTS\r
146 %token IMPORTS  \r
147 %token IN       \r
148 %token INHERITS\r
149 %token INTEGER  \r
150 %token INTERFACE\r
151 %token IS\r
152 %token LET\r
153 %token LIB      \r
154 %token LIKE     \r
155 %token LONG     \r
156 %token LOOP\r
157 %token ME\r
158 %token MOD\r
159 %token MODULE\r
160 %token MUSTINHERIT      \r
161 %token MUSTOVERRIDE\r
162 %token MYBASE\r
163 %token MYCLASS\r
164 %token NAMESPACE\r
165 %token NEW\r
166 %token NEXT     \r
167 %token NOT\r
168 %token NOTHING\r
169 %token NOTINHERITABLE\r
170 %token NOTOVERRIDABLE\r
171 %token OBJECT   \r
172 %token ON\r
173 %token OPTION   \r
174 %token OPTIONAL \r
175 %token OR\r
176 %token ORELSE\r
177 %token OVERLOADS\r
178 %token OVERRIDABLE      \r
179 %token OVERRIDES        \r
180 %token PARAM_ARRAY\r
181 %token PRESERVE\r
182 %token PRIVATE  \r
183 %token PROPERTY\r
184 %token PROTECTED\r
185 %token PUBLIC\r
186 %token RAISEEVENT\r
187 %token READONLY \r
188 %token REDIM\r
189 %token REM\r
190 %token REMOVEHANDLER\r
191 %token RESUME   \r
192 %token RETURN   \r
193 %token SELECT\r
194 %token SET\r
195 %token SHADOWS\r
196 %token SHARED\r
197 %token SHORT    \r
198 %token SINGLE\r
199 %token SIZEOF   \r
200 %token STATIC   \r
201 %token STEP\r
202 %token STOP\r
203 %token STRING   \r
204 %token STRUCTURE        \r
205 %token SUB\r
206 %token SYNCLOCK\r
207 %token THEN\r
208 %token THROW\r
209 %token TO\r
210 %token TRUE     \r
211 %token TRY      \r
212 %token TYPEOF   \r
213 %token UNICODE\r
214 %token UNTIL\r
215 %token VARIANT  \r
216 %token WHEN     \r
217 %token WHILE    \r
218 %token WITH\r
219 %token WITHEVENTS\r
220 %token WRITEONLY\r
221 %token XOR\r
222 \r
223 /* MonoBASIC single character operators/punctuation. */\r
224 %token OPEN_BRACKET  "["\r
225 %token CLOSE_BRACKET "]"\r
226 %token OPEN_PARENS   "("\r
227 %token CLOSE_PARENS  ")"\r
228 %token DOT           "."\r
229 %token COMMA         ","\r
230 %token COLON         ":"\r
231 \r
232 %token PLUS           "+"\r
233 %token MINUS          "-"\r
234 %token ASSIGN         "="\r
235 %token OP_LT          "<"\r
236 %token OP_GT          ">"\r
237 %token STAR           "*"\r
238 %token PERCENT        "%"\r
239 %token DIV            "/"\r
240 %token OP_EXP         "^"\r
241 %token INTERR         "?"\r
242 %token OP_IDIV        "\\"\r
243 %token OP_CONCAT      "&"\r
244 \r
245 /* MonoBASIC multi-character operators. */\r
246 %token OP_LE                  "<="\r
247 %token OP_GE                  ">="\r
248 %token OP_EQ                  "=="\r
249 %token OP_NE                  "<>"\r
250 %token OP_AND                 //"and"\r
251 %token OP_OR                  //"or"\r
252 %token OP_XOR                 //"xor"\r
253 %token OP_MODULUS             //"mod"\r
254 %token OP_MULT_ASSIGN         "*="\r
255 %token OP_DIV_ASSIGN          "/="\r
256 %token OP_IDIV_ASSIGN         "\\="\r
257 %token OP_ADD_ASSIGN          "+="\r
258 %token OP_SUB_ASSIGN          "-="\r
259 %token OP_CONCAT_ASSIGN       "&="\r
260 %token OP_EXP_ASSIGN          "^="\r
261 \r
262 /* Numbers */\r
263 %token LITERAL_INTEGER           "int literal"\r
264 %token LITERAL_SINGLE            "float literal"\r
265 %token LITERAL_DOUBLE            "double literal"\r
266 %token LITERAL_DECIMAL           "decimal literal"\r
267 %token LITERAL_CHARACTER         "character literal"\r
268 %token LITERAL_STRING            "string literal"\r
269 \r
270 %token IDENTIFIER\r
271 \r
272 /* Add precedence rules to solve dangling else s/r conflict */\r
273 %nonassoc LOWPREC\r
274 %nonassoc IF\r
275 %nonassoc ELSE\r
276 %right ASSIGN\r
277 %left OP_OR\r
278 %left OP_AND\r
279 %left BITWISE_OR\r
280 %left BITWISE_AND\r
281 %left OP_SHIFT_LEFT OP_SHIFT_RIGHT\r
282 %left PLUS MINUS\r
283 %left STAR DIV PERCENT\r
284 %right BITWISE_NOT CARRET UMINUS\r
285 %nonassoc OP_INC OP_DEC\r
286 %left OPEN_PARENS\r
287 %left OPEN_BRACKET OPEN_BRACE\r
288 %left DOT\r
289 %nonassoc HIGHPREC\r
290 \r
291 %start compilation_unit\r
292 %%\r
293 \r
294 compilation_unit\r
295         : opt_imports_directives \r
296           /* opt_attributes */\r
297           opt_namespace_member_declarations \r
298           EOF\r
299           {\r
300                 $$ = $3;\r
301           }\r
302         ;\r
303 \r
304 qualified_identifier\r
305         : IDENTIFIER\r
306         | qualified_identifier DOT IDENTIFIER \r
307           { \r
308             $$ = (($1).ToString ()) + "." + ($3.ToString ()); \r
309           }\r
310         ;\r
311 \r
312 opt_imports_directives\r
313         : /* empty */\r
314         | imports_directives\r
315         ;\r
316 \r
317 imports_directives\r
318         : imports_directive \r
319         | imports_directives imports_directive \r
320         ;\r
321 \r
322 imports_directive\r
323         : /* imports_alias_directive\r
324         | */ imports_namespace_directive\r
325         ;\r
326 \r
327 imports_namespace_directive\r
328         : IMPORTS namespace_name EOL \r
329           {\r
330                 current_namespace.Using ((string) $2);\r
331           }\r
332         ;\r
333 \r
334 opt_attributes\r
335         : /* empty */\r
336         ;\r
337 \r
338 namespace_declaration\r
339         : NAMESPACE qualified_identifier EOL\r
340           {\r
341                 current_namespace = new Namespace (current_namespace, (string) $2); \r
342           } \r
343           opt_imports_directives\r
344           opt_namespace_member_declarations\r
345           END NAMESPACE EOL\r
346           { \r
347                 current_namespace = current_namespace.Parent;\r
348           }\r
349         ;\r
350 \r
351 namespace_name\r
352         : qualified_identifier\r
353         ;\r
354 \r
355 \r
356 \r
357 opt_namespace_member_declarations\r
358         : /* empty */\r
359         | namespace_member_declarations\r
360         ;\r
361 \r
362 namespace_member_declarations\r
363         : namespace_member_declaration\r
364         | namespace_member_declarations namespace_member_declaration\r
365         ;\r
366 \r
367 namespace_member_declaration\r
368         : namespace_declaration\r
369         | type_declaration\r
370           {\r
371                 int mod_flags = 0;\r
372                 string name = "";\r
373 \r
374                 if ($1 is Class){\r
375                         Class c = (Class) $1;\r
376                         mod_flags = c.ModFlags;\r
377                         name = c.Name;\r
378                 } else if ($1 is Struct){\r
379                         Struct s = (Struct) $1;\r
380                         mod_flags = s.ModFlags;\r
381                         name = s.Name;\r
382                 } else\r
383                         break;\r
384 \r
385           }\r
386         ;\r
387 \r
388 \r
389 type_declaration\r
390         : class_declaration             \r
391         ;\r
392 \r
393 \r
394 class_declaration\r
395         : /* opt_attributes opt_modifiers */\r
396           CLASS IDENTIFIER /* opt_class_interfaces */ EOL\r
397           { \r
398           }\r
399           opt_class_member_declarations\r
400           END CLASS EOL\r
401           {\r
402           }\r
403         ;\r
404 \r
405 opt_class_member_declarations\r
406         : /* empty */\r
407         | class_member_declarations\r
408         ;\r
409 \r
410 class_member_declarations\r
411         : class_member_declaration\r
412         | class_member_declarations class_member_declaration\r
413         ;\r
414 \r
415 class_member_declaration\r
416         : type_declaration\r
417         | sub_declaration\r
418         ;\r
419 \r
420 sub_declaration\r
421         : SUB qualified_identifier OPEN_PARENS opt_formal_parameters CLOSE_PARENS EOL\r
422           opt_statements\r
423           END SUB EOL\r
424         ;\r
425 \r
426 opt_statements\r
427         : /* empty */\r
428         | qualified_identifier OPEN_PARENS opt_actual_parameters CLOSE_PARENS EOL\r
429         ;\r
430 \r
431 opt_formal_parameters \r
432         : /* empty */\r
433         | qualified_identifier AS qualified_identifier\r
434         ;\r
435 \r
436 opt_actual_parameters \r
437         : /* empty */\r
438         | qualified_identifier\r
439         | LITERAL_STRING\r
440         ;\r
441 \r
442 %%\r
443 \r
444 \r
445 Tokenizer lexer;\r
446 \r
447 public override int parse ()\r
448 {\r
449         current_namespace = new Namespace (null, "");\r
450         this.tree = rc.Tree;\r
451         current_container = tree.Types;\r
452         current_container.Namespace = current_namespace;\r
453 \r
454         UseExtendedSyntax = name.EndsWith(".mbs");\r
455 \r
456         lexer = new Tokenizer (input, name);\r
457         StringBuilder value = new StringBuilder ();\r
458 \r
459         global_errors = 0;\r
460         try \r
461         {\r
462                 if (yacc_verbose_flag)\r
463                         yyparse (lexer, new yydebug.yyDebugSimple ());\r
464                 else\r
465                         yyparse (lexer);\r
466         } \r
467         catch (Exception e)\r
468         {\r
469                 Console.WriteLine (lexer.location + "  : Parsing error ");\r
470                 Console.WriteLine (e);\r
471                 global_errors++;\r
472         }\r
473 \r
474         return global_errors;\r
475 }\r
476 \r
477 /* end end end */\r
478 }\r
479 \r
480 \r