[Top][All Lists]
[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 ();
}
}