commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue/geas/src/classdef parse.y


From: Reinhard Mueller
Subject: gnue/geas/src/classdef parse.y
Date: Sat, 20 Oct 2001 16:49:10 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Reinhard Mueller <address@hidden>       01/10/20 16:49:10

Modified files:
        geas/src/classdef: parse.y 

Log message:
        Implemented explicit references and lists.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/geas/src/classdef/parse.y.diff?tr1=1.17&tr2=1.18&r1=text&r2=text

Patches:
Index: gnue/geas/src/classdef/parse.y
diff -u gnue/geas/src/classdef/parse.y:1.17 gnue/geas/src/classdef/parse.y:1.18
--- gnue/geas/src/classdef/parse.y:1.17 Sat Oct 20 15:16:43 2001
+++ gnue/geas/src/classdef/parse.y      Sat Oct 20 16:49:10 2001
@@ -19,7 +19,7 @@
    along with GEAS; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-   $Id: parse.y,v 1.17 2001/10/20 19:16:43 reinhard Exp $
+   $Id: parse.y,v 1.18 2001/10/20 20:49:10 reinhard Exp $
 */
 
 %{
@@ -71,13 +71,20 @@
 static geas_cd_module *_find_module (const gchar *name);
 static geas_cd_class  *_find_class  (geas_cd_module *module, const gchar 
*name);
 static geas_cd_type   *_find_type   (geas_cd_module *module, const gchar 
*name);
+static geas_cd_field  *_find_field  (geas_cd_class *clss, const gchar *name);
 
 static void _set_type_type (geas_cd_type *type);
 static void _set_type_ref  (geas_cd_class *clss);
 static void _set_type_list (geas_cd_class *clss);
 
-static gboolean _new_field (const gchar *name);
+static gboolean _name_used (const gchar *name);
 
+static void _new_field (const gchar *name);
+static void _new_reference (const gchar *name, geas_cd_field *thisfield,
+                            geas_cd_field *otherfield);
+static void _new_list (const gchar *name, geas_cd_field *thisfield,
+                       geas_cd_field *otherfield);
+
 static gboolean _set_field_format (int format);
 
 %}
@@ -102,6 +109,7 @@
   geas_cd_module        *module;
   geas_cd_class         *class;
   geas_cd_type          *type;
+  geas_cd_field         *field;
 };
 
 /* ------------------------------------------------------------------------- *\
@@ -129,6 +137,8 @@
 %type <module>  moduleref
 %type <class>   classref
 %type <type>    typeref
+%type <field>   thisfield otherfield
+%type <string>  elemname
 %type <boolean> unique
 %type <boolean> desc
 
@@ -162,10 +172,10 @@
  * Classes, Extensions, and Types
 \* ------------------------------------------------------------------------- */
 
-unit:       class  '{' elements '}' ';'
-  |         extend '{' elements '}' ';'
-  |         type   '{' elements '}' ';'
-  |         error               '}' ';' { yyerrok; }
+unit:       class  '{' celements '}' ';'
+  |         extend '{' celements '}' ';'
+  |         type   '{' telements '}' ';'
+  |         error                '}' ';'{ yyerrok; }
 ;
 
 class:      access CLASS SYMBOL         {
@@ -232,26 +242,66 @@
  * Elements of a class or type: fields, methods etc.
 \* ------------------------------------------------------------------------- */
 
-elements:   element
-  |         elements element
+celements:  celement
+  |         celements celement
 ;
 
-element:    datatype fields ';'
-  |         datatype method ';'
-/* TODO
+celement:   datatype fields ';'
   |         REFERENCE reference ';'
   |         LIST list ';'
-*/
+  |         datatype method ';'
   |         index ';'
   |         orderby ';'
   |         error ';'                   { yyerrok; }
 ;
 
+telements:  telement
+  |         telements telement
+;
+
+telement:   datatype fields ';'
+  |         datatype method ';'
+  |         error ';'                   { yyerrok; }
+;
+
 datatype:   typeref                     { _set_type_type ($1); }
   |         classref '*'                { _set_type_ref ($1); }
   |         classref '[' ']'            { _set_type_list ($1); }
 ;
 
+elemname:   SYMBOL                      { if (_name_used ($1)) YYERROR; }
+;
+
+thisfield:  SYMBOL                      {
+                                          $$ = _find_field (NULL, $1);
+                                          g_free ($1);
+                                          if (!$$) YYERROR;
+                                        }
+;
+
+            /* FIXME: classref '.' SYMBOL would be better syntax */
+otherfield: classref '(' SYMBOL         {
+                                          $$ = _find_field ($1, $3);
+                                          g_free ($3);
+                                          if (!$$) YYERROR;
+                                        }
+            /* continued */ ')'
+;
+
+reference:  elemname ':' otherfield '=' thisfield
+                                        {
+                                          _new_reference ($1, $5, $3);
+                                          g_free ($1);
+                                        }
+;
+
+list:       elemname ':' otherfield '=' thisfield
+                                        {
+                                          _new_list ($1, $5, $3);
+                                          g_free ($1);
+                                        }
+;
+
 /* ------------------------------------------------------------------------- *\
  * Fields
 \* ------------------------------------------------------------------------- */
@@ -260,12 +310,7 @@
   |         fields ',' field
 ;
 
-field:      SYMBOL                      {
-                                          gboolean result;
-                                          result = _new_field ($1);
-                                          g_free ($1);
-                                          if (!result) YYERROR;
-                                        }
+field:      elemname                    { _new_field ($1); g_free ($1); }
             /* continued */ format fdefault properties
 ;
 
@@ -296,7 +341,7 @@
  * Methods
 \* ------------------------------------------------------------------------- */
 
-method:     SYMBOL '(' arguments ')'    { g_free ($1); /* TODO */ }
+method:     elemname '(' arguments ')'  { g_free ($1); /* TODO */ }
 ;
 
 arguments:  /* */                       { /* TODO */ }
@@ -706,6 +751,46 @@
 }
 
 /* ------------------------------------------------------------------------- *\
+ * Reference to a field
+\* ------------------------------------------------------------------------- */
+static geas_cd_field *
+_find_field (geas_cd_class *clss, const gchar *name)
+{
+  geas_cd_field *result;
+
+  switch (_current_pass)
+    {
+    case 1:
+      result = (geas_cd_field *)-1;     /* always indicate success */
+      break;
+
+    case 2:
+      if (clss)
+        {
+          /* FIXME: Should allow fully qualified name */
+          result = geas_cd_class_find_field (clss, _current_module, name);
+        }
+      else
+        {
+          /* FIXME: Should allow fully qualified name */
+          result = geas_cd_class_find_field (_current_class, _current_module,
+                                             name);
+        }
+      if (!result)
+        {
+          yyerror ("unknown field '%s'", name);
+        }
+      break;
+
+    default:
+      g_assert_not_reached ();
+      result = NULL;
+    }
+
+  return (result);
+}
+
+/* ------------------------------------------------------------------------- *\
  * Set the current active type to a normal or complex type
 \* ------------------------------------------------------------------------- */
 static void
@@ -772,34 +857,73 @@
 }
 
 /* ------------------------------------------------------------------------- *\
- * Found a new field
+ * Test if a name is used in the current class or type
 \* ------------------------------------------------------------------------- */
 static gboolean
-_new_field (const gchar *name)
+_name_used (const gchar *name)
 {
   switch (_current_pass)
     {
     case 1:
-      return (TRUE);
+      return (FALSE);
       break;
 
     case 2:
       if (_current_is_class)
         {
-          /* We are in a class definition */
           if (geas_cd_class_find_field (_current_class, _current_module, name))
             {
+              yyerror ("duplicate field or method name");
+              _current_field = NULL;
+              return (TRUE);
+            }
+          else
+            {
+              return (FALSE);
+            }
+        }
+      else
+        {
+          if (geas_cd_type_find_field (_current_type, name))
+            {
               yyerror ("duplicate field name");
               _current_field = NULL;
+              return (TRUE);
+            }
+          else
+            {
               return (FALSE);
             }
-          else if (_datatype_type)
+        }
+      break;
+
+    default:
+      g_assert_not_reached ();
+      return (TRUE);
+    }
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Found a new field
+\* ------------------------------------------------------------------------- */
+static void
+_new_field (const gchar *name)
+{
+  switch (_current_pass)
+    {
+    case 1:
+      break;
+
+    case 2:
+      if (_current_is_class)
+        {
+          /* We are in a class definition */
+          if (_datatype_type)
             {
               /* This field has a predefined type */
               _current_field = geas_cd_class_field_new (_current_class,
                                                         _current_module, name,
                                                         _datatype_type);
-              return (TRUE);
             }
           else if (_datatype_reference)
             {
@@ -809,7 +933,6 @@
                                                             name,
                                                             
_datatype_reference,
                                                             NULL, NULL);
-              return (TRUE);
             }
           else if (_datatype_list)
             {
@@ -818,55 +941,84 @@
                                                        _current_module, name,
                                                        _datatype_list, NULL,
                                                        NULL);
-              return (TRUE);
             }
           else
             {
               g_assert_not_reached ();
-              return (FALSE);
             }
         }
       else
         {
           /* We are in a compound type definition */
-          if (geas_cd_type_find_field (_current_type, name))
-            {
-              yyerror ("duplicate field name");
-              _current_field = NULL;
-              return (FALSE);
-            }
-          else if (_datatype_type)
+          if (_datatype_type)
             {
               /* This field has a predefined type */
               _current_field = geas_cd_type_field_new (_current_type, name,
                                                        _datatype_type);
-              return (TRUE);
             }
           else if (_datatype_reference)
             {
               /* This field is an implicit reference */
               _current_field = geas_cd_type_reference_new (_current_type, name,
                                                            
_datatype_reference);
-              return (TRUE);
             }
           else if (_datatype_list)
             {
               /* This field is an implicit list */
               _current_field = geas_cd_type_list_new (_current_type, name,
                                                       _datatype_list);
-              return (TRUE);
             }
           else
             {
               g_assert_not_reached ();
-              return (FALSE);
             }
         }
       break;
 
     default:
       g_assert_not_reached ();
-      return (FALSE);
+    }
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Found a new reference
+\* ------------------------------------------------------------------------- */
+static void
+_new_reference (const gchar *name, geas_cd_field *thisfield,
+                geas_cd_field *otherfield)
+{
+  switch (_current_pass)
+    {
+    case 1:
+      break;
+
+    case 2:
+      _current_field = geas_cd_class_reference_new
+        (_current_class, _current_module, name,
+         geas_cd_field_get_thisclass (otherfield), thisfield, otherfield);
+    default:
+      g_assert_not_reached ();
+    }
+}
+
+/* ------------------------------------------------------------------------- *\
+ * Found a new list
+\* ------------------------------------------------------------------------- */
+static void
+_new_list (const gchar *name, geas_cd_field *thisfield,
+           geas_cd_field *otherfield)
+{
+  switch (_current_pass)
+    {
+    case 1:
+      break;
+
+    case 2:
+      _current_field = geas_cd_class_list_new
+        (_current_class, _current_module, name,
+         geas_cd_field_get_thisclass (otherfield), thisfield, otherfield);
+    default:
+      g_assert_not_reached ();
     }
 }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]