[eros-cvs] cvs commit: eros/src/base/cross/bin/capidl SymTab.cxx SymTab.hxx gram.y test-input

shap@eros.cs.jhu.edu shap@eros.cs.jhu.edu
Sun, 1 Apr 2001 16:48:06 -0400


shap        01/04/01 16:48:06

  Modified:    src/base/cross/bin/capidl SymTab.cxx SymTab.hxx gram.y
                        test-input
  Log:
  Check in the current status of CapIDL

Revision  Changes    Path
1.6       +6 -0      eros/src/base/cross/bin/capidl/SymTab.cxx

Index: SymTab.cxx
===================================================================
RCS file: /cvs/eros/src/base/cross/bin/capidl/SymTab.cxx,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SymTab.cxx	2001/01/31 23:00:48	1.5
+++ SymTab.cxx	2001/04/01 20:48:06	1.6
@@ -467,6 +467,11 @@
       Diag::printf("<exception \"%s\">", name.str());
       break;
     }
+  case sc_caseTag:
+    {
+      Diag::printf("<caseTag \"%s\">", name.str());
+      break;
+    }
   default:
     {
       Diag::printf("UNKNOWN/BAD SYMBOL TYPE %d FOR: %s", cls, name.str());
@@ -488,6 +493,7 @@
   switch(cls){
   case sc_enum:
   case sc_Scope:
+  case sc_switch:
     {
       for(Symbol *child = children; child; child = child->next)
 	child->DumpTree(indent + 2);



1.7       +2 -0      eros/src/base/cross/bin/capidl/SymTab.hxx

Index: SymTab.hxx
===================================================================
RCS file: /cvs/eros/src/base/cross/bin/capidl/SymTab.hxx,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- SymTab.hxx	2001/01/31 23:00:48	1.6
+++ SymTab.hxx	2001/04/01 20:48:06	1.7
@@ -62,6 +62,8 @@
   sc_outformal,			/* OUT formal parameter name */
   sc_exception,			/* exception name */
   sc_interface,			/* interface name */
+  sc_switch,			/* switch scope */
+  sc_caseTag,			/* case discriminator */
 };
 
 struct Symbol {



1.8       +41 -4     eros/src/base/cross/bin/capidl/gram.y

Index: gram.y
===================================================================
RCS file: /cvs/eros/src/base/cross/bin/capidl/gram.y,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- gram.y	2001/01/31 23:00:48	1.7
+++ gram.y	2001/04/01 20:48:06	1.8
@@ -159,6 +159,8 @@
 %type  <NONE> top_definition
 %type  <NONE> mod_definitions
 %type  <NONE> mod_definition
+%type  <NONE> case_definitions
+%type  <NONE> case_definition
 %type  <NONE> if_definitions
 %type  <NONE> if_definition
 %type  <tok>  name_def
@@ -551,8 +553,15 @@
  |      members member
  ;
 
+/*SHAP:        top_definition         /* defines a name inside this scope */
 member:
-        top_definition         /* defines a name inside this scope */
+        struct_dcl ';'                          // a struct
+ |      union_dcl  ';'                          // a discriminated union
+ |      enum_dcl ';'                            // a set of const unsigneds
+ |      TYPEDEF type name_def ';'               // names a type
+ |      TYPEDEF name_def ';'                    // forward declaration
+ |      const_dcl ';'                           // constant value
+ |      repr_dcl ';'                            // advises on representation
  |      type name_def ';'  /* defines an actual member (ie, field) */ {
 	  Symbol *sym = Symbol::create($2.is, sc_member);
 	  if (sym == 0) {
@@ -654,17 +663,45 @@
  * possible scoping rule resolutions.
  */
 case:
-        case_labels top_definitions element_dcl
+        case_labels case_definitions element_dcl
  ;
 
+case_definitions:
+        /* empty */ {}
+ | case_definitions case_definition
+ ;
+
+case_definition:
+        struct_dcl ';'                          // a struct
+ |      union_dcl  ';'                          // a discriminated union
+ |      enum_dcl ';'                            // a set of const unsigneds
+ |      TYPEDEF type name_def ';'               // names a type
+ |      TYPEDEF name_def ';'                    // forward declaration
+ |      const_dcl ';'                           // constant value
+ |      repr_dcl ';'                            // advises on representation
+
 case_labels:
         case_label
  |      case_labels case_label
  ;
 
 case_label:
-        CASE const_expr ':'
- |      DEFAULT ':'
+        CASE const_expr ':' {
+	  char *s = mpz_get_str(NULL, 10, $2->v.i);
+	  Symbol *sym = Symbol::create(s, sc_caseTag);
+	  if (sym == 0) {
+	    Diag::printf("%s:%d: syntax error -- identifier reused\n",
+			 current_file.str(), current_line);
+	  }
+	  delete s;
+	}
+ |      DEFAULT ':' {
+	  Symbol *sym = Symbol::create(".default:", sc_caseTag);
+	  if (sym == 0) {
+	    Diag::printf("%s:%d: syntax error -- identifier reused\n",
+			 current_file.str(), current_line);
+	  }
+	}
  ;
 
 element_dcl:



1.4       +6 -0      eros/src/base/cross/bin/capidl/test-input

Index: test-input
===================================================================
RCS file: /cvs/eros/src/base/cross/bin/capidl/test-input,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- test-input	2001/01/25 03:30:20	1.3
+++ test-input	2001/04/01 20:48:06	1.4
@@ -15,3 +15,9 @@
 
 const integer kt = min ( integer<32> );
 exception RC_RequestError ;
+
+union fred {
+      switch (int sw) {
+      case 0:  int i;
+      };
+};