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