fix gettext warnings
[supertux.git] / tools / miniswig / parser.yy
index 0de8f6c..a54c0af 100644 (file)
@@ -69,6 +69,8 @@ private:
 %token T_CLASS
 %token T_STRUCT
 %token T_STATIC
+%token T_SUSPEND
+%token T_CUSTOM
 %token T_CONST
 %token T_UNSIGNED
 %token T_SIGNED
@@ -141,7 +143,7 @@ namespace_member:
 ;  
 
 class_declaration:
-    T_CLASS T_ID '{' 
+    T_CLASS T_ID 
         {
             current_class = new Class();
             current_class->name = $2;
@@ -150,12 +152,39 @@ class_declaration:
             last_docucomment = "";
             current_visibility = ClassMember::PROTECTED;
         }
-    class_body '}' ';'
+    superclass_list '{' class_body '}' ';'
         {
             $$ = current_class;
         }
 ;
 
+superclass_list:
+    /* empty */
+    | ':' superclasses
+;
+
+superclasses:
+      superclass
+    | superclasses ',' superclass
+;
+
+superclass:
+    superclass_visibility type_identifier
+        {
+            Class* superclass = dynamic_cast<Class*> ($2);
+            if(superclass == 0)
+                throw ParseError("SuperClass is not a Class type");
+            current_class->super_classes.push_back(superclass);
+            superclass->sub_classes.push_back(current_class);
+        }
+;
+
+superclass_visibility:
+    T_PUBLIC
+    | T_PROTECTED
+    | T_PRIVATE
+;
+
 class_body: /* empty */
         | class_body class_body_element
 ;
@@ -225,6 +254,8 @@ field_declaration:
         {
             current_field = new Field();
             current_field->type = $1;
+            current_field->docu_comment = last_docucomment;
+            last_docucomment = "";
             current_field->name = $2;
             free($2);
         }
@@ -260,17 +291,6 @@ maybe_const_initialisation:
 function_declaration:
     type T_ID '(' 
         {
-            /*
-            current_function = new Function();
-            current_function->type = Function::FUNCTION;
-            current_function->return_type = *($2);
-            delete $2;
-            current_function->name = $3;
-            free($3);
-            current_function->docu_comment = last_docucomment;
-            last_docucomment = "";
-            */
-
             current_function = new Function();
             current_function->type = Function::FUNCTION;
             current_function->return_type = *($1);
@@ -280,12 +300,25 @@ function_declaration:
             current_function->docu_comment = last_docucomment;
             last_docucomment = "";
         }                           
-    parameter_list ')' abstract_declaration ';'
+    parameter_list ')' function_attributes abstract_declaration ';'
         {
             $$ = current_function;
         }
 ;
 
+function_attributes:
+    /* empty */
+    | T_CONST function_attributes
+    | T_CUSTOM function_attributes
+      {
+        current_function->custom = true;
+      }
+    | T_SUSPEND function_attributes
+      {
+        current_function->suspend = true;
+      }
+;
+
 abstract_declaration:
     /* empty */
     | '=' T_INT
@@ -384,7 +417,6 @@ atomic_type:
 type_identifier:
     T_ATOMIC_TYPE
         {
-            // search for type in current compilation unit...
             $$ = $1;
         }
     | namespace_refs "::" T_ATOMIC_TYPE