aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/parse-scan.y
diff options
context:
space:
mode:
authorAlexandre Petit-Bianco <apbianco@cygnus.com>2000-03-28 08:33:45 +0000
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>2000-03-28 00:33:45 -0800
commit0981a85961c671c04e797252ad30949a5037b1ce (patch)
treeed14e0e93106add53c8cfd8ea6b287c2e4009446 /gcc/java/parse-scan.y
parente3c2afabd3df995899ecf565616a410aa85e95a3 (diff)
downloadgcc-0981a85961c671c04e797252ad30949a5037b1ce.zip
gcc-0981a85961c671c04e797252ad30949a5037b1ce.tar.gz
gcc-0981a85961c671c04e797252ad30949a5037b1ce.tar.bz2
[multiple changes]
2000-03-28 Alexandre Petit-Bianco <apbianco@cygnus.com> * parse-scan.y (pop_class_context): Reset `inner_qualifier_length' to 0 when it reaches -1. 2000-03-27 Alexandre Petit-Bianco <apbianco@cygnus.com> * jcf-parse.c (get_constant): Properly cast `num' during the invocation of `add_double call'. * jcf-write.c (push_long_const): Properly cast `lo' before comparing it to short bounds. * parse-scan.y (interface_declaration:): Rule re-arrange so that `interface_body:' is reduced after the current interface is pushed. 2000-02-28 Alexandre Petit-Bianco <apbianco@cygnus.com> * parse-scan.y (inner_qualifier, inner_qualifier_length): New static globals. (push_class_context, pop_class_context): New function. (class_body:): Call pop_class_context. (interface_body:): Likewise. (INNER_QUALIFIER): New macro. (report_class_declaration): Changed output format and use INNER_QUALIFIER. Call push_class_context. From-SVN: r32779
Diffstat (limited to 'gcc/java/parse-scan.y')
-rw-r--r--gcc/java/parse-scan.y55
1 files changed, 48 insertions, 7 deletions
diff --git a/gcc/java/parse-scan.y b/gcc/java/parse-scan.y
index 8d8577b..73a46ab 100644
--- a/gcc/java/parse-scan.y
+++ b/gcc/java/parse-scan.y
@@ -66,6 +66,10 @@ static int absorber;
static const char *current_class;
static const char *package_name;
+/* Keep track of the current inner class qualifier. */
+static char *inner_qualifier;
+static int inner_qualifier_length;
+
/* Keep track of whether things have be listed before. */
static int previous_output;
@@ -92,6 +96,8 @@ struct method_declarator {
/* Two actions for this grammar */
static void report_class_declaration PARAMS ((const char *));
static void report_main_declaration PARAMS ((struct method_declarator *));
+static void push_class_context PARAMS ((const char *));
+static void pop_class_context PARAMS ((void));
#include "lex.h"
#include "parse.h"
@@ -357,7 +363,9 @@ interface_type_list:
class_body:
OCB_TK CCB_TK
+ { pop_class_context (); }
| OCB_TK class_body_declarations CCB_TK
+ { pop_class_context (); }
;
class_body_declarations:
@@ -564,14 +572,18 @@ this_or_super: /* Added, simplifies error diagnostics */
/* 19.9 Productions from 9: Interfaces */
/* 19.9.1 Productions from 9.1: Interfaces Declarations */
interface_declaration:
- INTERFACE_TK identifier interface_body
+ INTERFACE_TK identifier
{ report_class_declaration ($2); modifier_value = 0; }
-| modifiers INTERFACE_TK identifier interface_body
+ interface_body
+| modifiers INTERFACE_TK identifier
{ report_class_declaration ($3); modifier_value = 0; }
-| INTERFACE_TK identifier extends_interfaces interface_body
+ interface_body
+| INTERFACE_TK identifier extends_interfaces
{ report_class_declaration ($2); modifier_value = 0; }
-| modifiers INTERFACE_TK identifier extends_interfaces interface_body
+ interface_body
+| modifiers INTERFACE_TK identifier extends_interfaces
{ report_class_declaration ($3); modifier_value = 0; }
+ interface_body
;
extends_interfaces:
@@ -581,7 +593,9 @@ extends_interfaces:
interface_body:
OCB_TK CCB_TK
+ { pop_class_context (); }
| OCB_TK interface_member_declarations CCB_TK
+ { pop_class_context (); }
;
interface_member_declarations:
@@ -1110,7 +1124,33 @@ java_push_parser_context ()
ctxp = new;
}
+static void
+push_class_context (name)
+ const char *name;
+{
+ size_t name_length = strlen (name);
+ inner_qualifier = xrealloc (inner_qualifier,
+ inner_qualifier_length + name_length+2);
+ memcpy (inner_qualifier+inner_qualifier_length, name, name_length);
+ inner_qualifier_length += name_length;
+ inner_qualifier [inner_qualifier_length] = '$';
+ inner_qualifier [++inner_qualifier_length] = '\0';
+}
+
+static void
+pop_class_context ()
+{
+ while (--inner_qualifier_length > 0
+ && inner_qualifier [inner_qualifier_length-1] != '$')
+ ;
+ inner_qualifier = xrealloc (inner_qualifier, inner_qualifier_length+1);
+ inner_qualifier [inner_qualifier_length] = '\0';
+ if (inner_qualifier_length == -1)
+ inner_qualifier_length = 0;
+}
+
/* Actions defined here */
+#define INNER_QUALIFIER (inner_qualifier ? inner_qualifier : "")
static void
report_class_declaration (name)
@@ -1128,11 +1168,12 @@ report_class_declaration (name)
}
if (package_name)
- fprintf (out, "%s.%s ", package_name, name);
+ fprintf (out, "%s.%s%s ", package_name, INNER_QUALIFIER, name);
else
- fprintf (out, "%s ", name);
+ fprintf (out, "%s%s ", INNER_QUALIFIER, name);
}
-
+
+ push_class_context (name);
current_class = name;
}