syncing
[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_namespace_member_declarations \r
295           EOF\r
296           {\r
297                 $$ = $3;\r
298           }\r
299         ;\r
300 \r
301 qualified_identifier\r
302         : IDENTIFIER\r
303         | qualified_identifier DOT IDENTIFIER \r
304           { \r
305             $$ = (($1).ToString ()) + "." + ($3.ToString ()); \r
306           }\r
307         ;\r
308 \r
309 opt_imports_directives\r
310         : /* empty */\r
311         | imports_directives\r
312         ;\r
313 \r
314 imports_directives\r
315         : imports_directive \r
316         | imports_directives imports_directive \r
317         ;\r
318 \r
319 imports_directive\r
320         : /* imports_alias_directive\r
321         | */ imports_namespace_directive\r
322         ;\r
323 \r
324 imports_namespace_directive\r
325         : IMPORTS namespace_name EOL \r
326           {\r
327                 current_namespace.Using ((string) $2);\r
328           }\r
329         ;\r
330 \r
331 opt_attributes\r
332         : /* empty */\r
333         ;\r
334 \r
335 namespace_declaration\r
336         : NAMESPACE qualified_identifier EOL\r
337           {\r
338                 current_namespace = new Namespace (current_namespace, (string) $2); \r
339           } \r
340           opt_imports_directives\r
341           opt_namespace_member_declarations\r
342           END NAMESPACE EOL\r
343           { \r
344                 current_namespace = current_namespace.Parent;\r
345           }\r
346         ;\r
347 \r
348 namespace_name\r
349         : qualified_identifier\r
350         ;\r
351 \r
352 \r
353 \r
354 opt_namespace_member_declarations\r
355         : /* empty */\r
356         | namespace_member_declarations\r
357         ;\r
358 \r
359 namespace_member_declarations\r
360         : namespace_member_declaration\r
361         | namespace_member_declarations namespace_member_declaration\r
362         ;\r
363 \r
364 namespace_member_declaration\r
365         : namespace_declaration\r
366         | module_declaration\r
367           {\r
368                 int mod_flags = 0;\r
369                 string name = "";\r
370 \r
371                 if ($1 is Class){\r
372                         Class c = (Class) $1;\r
373                         mod_flags = c.ModFlags;  //TODO: Add ModuleAttribute\r
374                         name = c.Name;\r
375                 } else\r
376                         break;\r
377 \r
378           }\r
379         | type_declaration\r
380           {\r
381                 int mod_flags = 0;\r
382                 string name = "";\r
383 \r
384                 if ($1 is Class){\r
385                         Class c = (Class) $1;\r
386                         mod_flags = c.ModFlags;\r
387                         name = c.Name;\r
388                 } else if ($1 is Struct){\r
389                         Struct s = (Struct) $1;\r
390                         mod_flags = s.ModFlags;\r
391                         name = s.Name;\r
392                 } else\r
393                         break;\r
394 \r
395           }\r
396         ;\r
397 \r
398 type_declaration\r
399         : /* empty */\r
400         | class_declaration\r
401         ;\r
402 \r
403 \r
404 class_declaration\r
405         : /* opt_attributes opt_modifiers */\r
406           CLASS IDENTIFIER /* opt_class_interfaces */ EOL\r
407           { \r
408           }\r
409           opt_class_member_declarations\r
410           END CLASS EOL\r
411           {\r
412           }\r
413         ;\r
414 \r
415 module_declaration\r
416         : /* opt_attributes opt_modifiers */\r
417           MODULE IDENTIFIER EOL\r
418           { \r
419           }\r
420           opt_class_member_declarations\r
421           END MODULE EOL\r
422           {\r
423           }\r
424         ;\r
425 \r
426 opt_class_member_declarations\r
427         : /* empty */\r
428         | class_member_declarations\r
429         ;\r
430 \r
431 class_member_declarations\r
432         : class_member_declaration\r
433         | class_member_declarations class_member_declaration\r
434         ;\r
435 \r
436 class_member_declaration\r
437         : type_declaration\r
438         | sub_declaration\r
439         ;\r
440 \r
441 sub_declaration\r
442         : SUB qualified_identifier OPEN_PARENS opt_formal_parameters CLOSE_PARENS EOL\r
443           opt_statements\r
444           END SUB EOL\r
445         ;\r
446 \r
447 opt_statements\r
448         : /* empty */\r
449         | qualified_identifier OPEN_PARENS opt_actual_parameters CLOSE_PARENS EOL\r
450         ;\r
451 \r
452 opt_formal_parameters \r
453         : /* empty */\r
454         | qualified_identifier AS qualified_identifier\r
455         ;\r
456 \r
457 opt_actual_parameters \r
458         : /* empty */\r
459         | qualified_identifier\r
460         | LITERAL_STRING\r
461         ;\r
462 \r
463 %%\r
464 \r
465 \r
466 Tokenizer lexer;\r
467 \r
468 public Tokenizer Lexer {\r
469         get {\r
470                 return lexer;\r
471         }\r
472 }                  \r
473 \r
474 public override int parse ()\r
475 {\r
476         current_namespace = new Namespace (null, "");\r
477         current_container = RootContext.Tree.Types;\r
478         current_container.Namespace = current_namespace;\r
479 \r
480         UseExtendedSyntax = name.EndsWith(".mbs");\r
481 \r
482         lexer = new Tokenizer (input, name, defines);\r
483         StringBuilder value = new StringBuilder ();\r
484 \r
485         global_errors = 0;\r
486         try \r
487         {\r
488                 if (yacc_verbose_flag)\r
489                         yyparse (lexer, new yydebug.yyDebugSimple ());\r
490                 else\r
491                         yyparse (lexer);\r
492         } \r
493         catch (Exception e)\r
494         {\r
495                 Console.WriteLine (lexer.location + "  : Parsing error ");\r
496                 Console.WriteLine (e);\r
497                 global_errors++;\r
498         }\r
499 \r
500         return global_errors;\r
501 }\r
502 \r
503 /* end end end */\r
504 }\r
505 \r
506 \r