aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/parse-scan.y
diff options
context:
space:
mode:
authorAnthony Green <green@gcc.gnu.org>1998-09-06 15:36:06 +0000
committerAnthony Green <green@gcc.gnu.org>1998-09-06 15:36:06 +0000
commite04a16fbeee9504247e0d069171a627096225028 (patch)
treeb78f906318225a5e7bd3471f008be772727bdcea /gcc/java/parse-scan.y
parentfc08e32958a1df77493bfe4abc52f88c7ade6251 (diff)
downloadgcc-e04a16fbeee9504247e0d069171a627096225028.zip
gcc-e04a16fbeee9504247e0d069171a627096225028.tar.gz
gcc-e04a16fbeee9504247e0d069171a627096225028.tar.bz2
Initial revision
From-SVN: r22299
Diffstat (limited to 'gcc/java/parse-scan.y')
-rw-r--r--gcc/java/parse-scan.y1162
1 files changed, 1162 insertions, 0 deletions
diff --git a/gcc/java/parse-scan.y b/gcc/java/parse-scan.y
new file mode 100644
index 0000000..11c9978
--- /dev/null
+++ b/gcc/java/parse-scan.y
@@ -0,0 +1,1162 @@
+/* Parser grammar for quick source code scan of Java(TM) language programs.
+ Copyright (C) 1998 Free Software Foundation, Inc.
+ Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+
+Java and all Java-based marks are trademarks or registered trademarks
+of Sun Microsystems, Inc. in the United States and other countries.
+The Free Software Foundation is independent of Sun Microsystems, Inc. */
+
+/* This file parses Java source code. Action can be further completed
+to achieve a desired behavior. This file isn't part of the Java
+language gcc front end.
+
+The grammar conforms to the Java grammar described in "The Java(TM)
+Language Specification. J. Gosling, B. Joy, G. Steele. Addison Wesley
+1996, ISBN 0-201-63451-1"
+
+Some rules have been modified to support JDK1.1 inner classes
+definitions and other extensions. */
+
+%{
+#define JC1_LITE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Definitions for PROTO and VPROTO macros */
+#include "gansidecl.h"
+#include "obstack.h"
+
+extern char *input_filename;
+extern FILE *finput, *out;
+
+/* Obstack for the lexer. */
+struct obstack temporary_obstack;
+
+/* The current parser context. */
+static struct parser_ctxt *ctxp;
+
+/* Error and warning counts, current line number, because they're used
+ elsewhere */
+int java_error_count;
+int java_warning_count;
+int lineno;
+
+/* Tweak default rules when necessary. */
+static int absorber;
+#define USE_ABSORBER absorber = 0
+
+/* Keep track of the current class name and package name. */
+static char *current_class;
+static char *package_name;
+
+/* Keep track of whether things have be listed before. */
+static int previous_output;
+
+/* Record modifier uses */
+static int modifier_value;
+
+/* Record a method declaration */
+struct method_declarator {
+ char *method_name;
+ char *args;
+};
+#define NEW_METHOD_DECLARATOR(D,N,A) \
+{ \
+ (D) = \
+ (struct method_declarator *)xmalloc (sizeof (struct method_declarator)); \
+ (D)->method_name = (N); \
+ (D)->args = (A); \
+}
+
+/* Two actions for this grammar */
+static void report_class_declaration PROTO ((char *));
+static void report_main_declaration PROTO ((struct method_declarator *));
+
+/* Other extern functions */
+char *xmalloc PROTO ((unsigned));
+char *xstrdup PROTO ((char *));
+
+#include "lex.h"
+#include "parse.h"
+%}
+
+%union {
+ char *node;
+ struct method_declarator *declarator;
+ int value; /* For modifiers */
+}
+
+%pure_parser
+
+/* Things defined here have to match the order of what's in the
+ binop_lookup table. */
+
+%token PLUS_TK MINUS_TK MULT_TK DIV_TK REM_TK
+%token LS_TK SRS_TK ZRS_TK
+%token AND_TK XOR_TK OR_TK
+%token BOOL_AND_TK BOOL_OR_TK
+%token EQ_TK NEQ_TK GT_TK GTE_TK LT_TK LTE_TK
+
+/* This maps to the same binop_lookup entry than the token above */
+
+%token PLUS_ASSIGN_TK MINUS_ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK
+%token REM_ASSIGN_TK
+%token LS_ASSIGN_TK SRS_ASSIGN_TK ZRS_ASSIGN_TK
+%token AND_ASSIGN_TK XOR_ASSIGN_TK OR_ASSIGN_TK
+
+
+/* Modifier TOKEN have to be kept in this order. Don't scramble it */
+
+%token PUBLIC_TK PRIVATE_TK PROTECTED_TK
+%token STATIC_TK FINAL_TK SYNCHRONIZED_TK
+%token VOLATILE_TK TRANSIENT_TK NATIVE_TK
+%token PAD_TK ABSTRACT_TK MODIFIER_TK
+
+/* Keep those two in order, too */
+%token DECR_TK INCR_TK
+
+/* From now one, things can be in any order */
+
+%token DEFAULT_TK IF_TK THROW_TK
+%token BOOLEAN_TK DO_TK IMPLEMENTS_TK
+%token THROWS_TK BREAK_TK IMPORT_TK
+%token ELSE_TK INSTANCEOF_TK RETURN_TK
+%token VOID_TK CATCH_TK INTERFACE_TK
+%token CASE_TK EXTENDS_TK FINALLY_TK
+%token SUPER_TK WHILE_TK CLASS_TK
+%token SWITCH_TK CONST_TK TRY_TK
+%token FOR_TK NEW_TK CONTINUE_TK
+%token GOTO_TK PACKAGE_TK THIS_TK
+
+%token BYTE_TK SHORT_TK INT_TK LONG_TK
+%token CHAR_TK INTEGRAL_TK
+
+%token FLOAT_TK DOUBLE_TK FP_TK
+
+%token ID_TK
+
+%token REL_QM_TK REL_CL_TK NOT_TK NEG_TK
+
+%token ASSIGN_ANY_TK ASSIGN_TK
+%token OP_TK CP_TK OCB_TK CCB_TK OSB_TK CSB_TK SC_TK C_TK DOT_TK
+
+%token STRING_LIT_TK CHAR_LIT_TK INT_LIT_TK FP_LIT_TK
+%token TRUE_TK FALSE_TK BOOL_LIT_TK NULL_TK
+
+%type <node> ID_TK identifier name simple_name qualified_name type
+ primitive_type reference_type array_type formal_parameter_list
+ formal_parameter class_or_interface_type class_type interface_type
+%type <declarator> method_declarator
+%type <value> MODIFIER_TK
+
+%%
+/* 19.2 Production from 2.3: The Syntactic Grammar */
+goal:
+ compilation_unit
+;
+
+/* 19.3 Productions from 3: Lexical structure */
+literal:
+ INT_LIT_TK
+| FP_LIT_TK
+| BOOL_LIT_TK
+| CHAR_LIT_TK
+| STRING_LIT_TK
+| NULL_TK
+;
+
+/* 19.4 Productions from 4: Types, Values and Variables */
+type:
+ primitive_type
+| reference_type
+;
+
+primitive_type:
+ INTEGRAL_TK
+ {
+ /* use preset global here. FIXME */
+ $$ = xstrdup ("int");
+ }
+| FP_TK
+ {
+ /* use preset global here. FIXME */
+ $$ = xstrdup ("double");
+ }
+| BOOLEAN_TK
+ {
+ /* use preset global here. FIXME */
+ $$ = xstrdup ("boolean");
+ }
+;
+
+reference_type:
+ class_or_interface_type
+| array_type
+;
+
+class_or_interface_type:
+ name
+;
+
+class_type:
+ class_or_interface_type /* Default rule */
+;
+
+interface_type:
+ class_or_interface_type
+;
+
+array_type:
+ primitive_type OSB_TK CSB_TK
+| name OSB_TK CSB_TK
+ {
+ char *n = xmalloc (strlen ($1)+2);
+ n [0] = '[';
+ strcpy (n+1, $1);
+ $$ = n;
+ }
+| array_type OSB_TK CSB_TK
+ {
+ char *n = xmalloc (strlen ($1)+2);
+ n [0] = '[';
+ strcpy (n+1, $1);
+ $$ = n;
+ }
+;
+
+/* 19.5 Productions from 6: Names */
+name:
+ simple_name /* Default rule */
+| qualified_name /* Default rule */
+;
+
+simple_name:
+ identifier /* Default rule */
+;
+
+qualified_name:
+ name DOT_TK identifier
+ {
+ char *n = xmalloc (strlen ($1)+strlen ($3)+2);
+ sprintf (n, "%s.s", $1, $3);
+ $$ = n;
+ }
+;
+
+identifier:
+ ID_TK
+;
+
+/* 19.6: Production from 7: Packages */
+compilation_unit:
+| package_declaration
+| import_declarations
+| type_declarations
+| package_declaration import_declarations
+| package_declaration type_declarations
+| import_declarations type_declarations
+| package_declaration import_declarations type_declarations
+;
+
+import_declarations:
+ import_declaration
+| import_declarations import_declaration
+;
+
+type_declarations:
+ type_declaration
+| type_declarations type_declaration
+;
+
+package_declaration:
+ PACKAGE_TK name SC_TK
+ { package_name = $2; }
+;
+
+import_declaration:
+ single_type_import_declaration
+| type_import_on_demand_declaration
+;
+
+single_type_import_declaration:
+ IMPORT_TK name SC_TK
+;
+
+type_import_on_demand_declaration:
+ IMPORT_TK name DOT_TK MULT_TK SC_TK
+;
+
+type_declaration:
+ class_declaration
+| interface_declaration
+| SC_TK
+;
+
+/* 19.7 Shortened from the original:
+ modifiers: modifier | modifiers modifier
+ modifier: any of public... */
+modifiers:
+ MODIFIER_TK
+ {
+ if ($1 == PUBLIC_TK)
+ modifier_value++;
+ if ($1 == STATIC_TK)
+ modifier_value++;
+ USE_ABSORBER;
+ }
+| modifiers MODIFIER_TK
+ {
+ if ($2 == PUBLIC_TK)
+ modifier_value++;
+ if ($2 == STATIC_TK)
+ modifier_value++;
+ USE_ABSORBER;
+ }
+;
+
+/* 19.8.1 Production from $8.1: Class Declaration */
+class_declaration:
+ modifiers CLASS_TK identifier super interfaces
+ {
+ report_class_declaration($3);
+ modifier_value = 0;
+ }
+ class_body
+| CLASS_TK identifier super interfaces
+ { report_class_declaration($2); }
+ class_body
+;
+
+super:
+| EXTENDS_TK class_type
+;
+
+interfaces:
+| IMPLEMENTS_TK interface_type_list
+;
+
+interface_type_list:
+ interface_type
+ { USE_ABSORBER; }
+| interface_type_list C_TK interface_type
+ { USE_ABSORBER; }
+;
+
+class_body:
+ OCB_TK CCB_TK
+| OCB_TK class_body_declarations CCB_TK
+;
+
+class_body_declarations:
+ class_body_declaration
+| class_body_declarations class_body_declaration
+;
+
+class_body_declaration:
+ class_member_declaration
+| static_initializer
+| constructor_declaration
+| block /* Added, JDK1.1, instance initializer */
+;
+
+class_member_declaration:
+ field_declaration
+| method_declaration
+| class_declaration /* Added, JDK1.1 inner classes */
+| interface_declaration /* Added, JDK1.1 inner classes */
+;
+
+/* 19.8.2 Productions from 8.3: Field Declarations */
+field_declaration:
+ type variable_declarators SC_TK
+ { USE_ABSORBER; }
+| modifiers type variable_declarators SC_TK
+ { modifier_value = 0; }
+;
+
+variable_declarators:
+ /* Should we use build_decl_list () instead ? FIXME */
+ variable_declarator /* Default rule */
+| variable_declarators C_TK variable_declarator
+;
+
+variable_declarator:
+ variable_declarator_id
+| variable_declarator_id ASSIGN_TK variable_initializer
+;
+
+variable_declarator_id:
+ identifier
+ { USE_ABSORBER; }
+| variable_declarator_id OSB_TK CSB_TK
+;
+
+variable_initializer:
+ expression
+| array_initializer
+;
+
+/* 19.8.3 Productions from 8.4: Method Declarations */
+method_declaration:
+ method_header method_body
+;
+
+method_header:
+ type method_declarator throws
+ { USE_ABSORBER; }
+| VOID_TK method_declarator throws
+| modifiers type method_declarator throws
+ { modifier_value = 0; }
+| modifiers VOID_TK method_declarator throws
+ {
+ report_main_declaration ($3);
+ modifier_value = 0;
+ }
+;
+
+method_declarator:
+ identifier OP_TK CP_TK
+ {
+ struct method_declarator *d;
+ NEW_METHOD_DECLARATOR (d, $1, NULL);
+ $$ = d;
+ }
+| identifier OP_TK formal_parameter_list CP_TK
+ {
+ struct method_declarator *d;
+ NEW_METHOD_DECLARATOR (d, $1, $3);
+ $$ = d;
+ }
+| method_declarator OSB_TK CSB_TK
+;
+
+formal_parameter_list:
+ formal_parameter
+| formal_parameter_list C_TK formal_parameter
+ {
+ char *n = xmalloc (strlen ($1)+strlen($3)+2);
+ sprintf (n, "%s,%s", $1, $3);
+ $$ = n;
+ }
+;
+
+formal_parameter:
+ type variable_declarator_id
+ {
+ USE_ABSORBER;
+ $$ = $1;
+ }
+| modifiers type variable_declarator_id /* Added, JDK1.1 final locals */
+ { $$ = $2; }
+;
+
+throws:
+| THROWS_TK class_type_list
+;
+
+class_type_list:
+ class_type
+ { USE_ABSORBER; }
+| class_type_list C_TK class_type
+ { USE_ABSORBER; }
+;
+
+method_body:
+ block
+| block SC_TK
+| SC_TK
+;
+
+/* 19.8.4 Productions from 8.5: Static Initializers */
+static_initializer:
+ static block
+| static block SC_TK /* Shouldn't be here. FIXME */
+;
+
+static: /* Test lval.sub_token here */
+ MODIFIER_TK
+ { USE_ABSORBER; }
+;
+
+/* 19.8.5 Productions from 8.6: Constructor Declarations */
+/* NOTE FOR FURTHER WORK ON CONSTRUCTORS:
+ - If a forbidded modifier is found, the the error is either the use of
+ a forbidded modifier for a constructor OR bogus attempt to declare a
+ method without having specified the return type. FIXME */
+constructor_declaration:
+ constructor_declarator throws constructor_body
+| modifiers constructor_declarator throws constructor_body
+ { modifier_value = 0; }
+/* extra SC_TK, FIXME */
+| constructor_declarator throws constructor_body SC_TK
+/* extra SC_TK, FIXME */
+| modifiers constructor_declarator throws constructor_body SC_TK
+ { modifier_value = 0; }
+/* I'm not happy with the SC_TK addition. It isn't in the grammer and should
+ probably be matched by and empty statement. But it doesn't work. FIXME */
+;
+
+constructor_declarator:
+ simple_name OP_TK CP_TK
+ { USE_ABSORBER; }
+| simple_name OP_TK formal_parameter_list CP_TK
+ { USE_ABSORBER; }
+;
+
+constructor_body:
+ OCB_TK CCB_TK
+| OCB_TK explicit_constructor_invocation CCB_TK
+| OCB_TK block_statements CCB_TK
+| OCB_TK explicit_constructor_invocation block_statements CCB_TK
+;
+
+/* Error recovery for that rule moved down expression_statement: rule. */
+explicit_constructor_invocation:
+ this_or_super OP_TK CP_TK SC_TK
+| this_or_super OP_TK argument_list CP_TK SC_TK
+ /* Added, JDK1.1 inner classes. Modified because the rule
+ 'primary' couldn't work. */
+| name DOT_TK SUPER_TK OP_TK argument_list CP_TK SC_TK
+ { USE_ABSORBER; }
+| name DOT_TK SUPER_TK OP_TK CP_TK SC_TK
+ { USE_ABSORBER; }
+;
+
+this_or_super: /* Added, simplifies error diagnostics */
+ THIS_TK
+| SUPER_TK
+;
+
+/* 19.9 Productions from 9: Interfaces */
+/* 19.9.1 Productions from 9.1: Interfaces Declarations */
+interface_declaration:
+ INTERFACE_TK identifier interface_body
+| modifiers INTERFACE_TK identifier interface_body
+ { modifier_value = 0; }
+| INTERFACE_TK identifier extends_interfaces interface_body
+| modifiers INTERFACE_TK identifier extends_interfaces interface_body
+ { modifier_value = 0; }
+;
+
+extends_interfaces:
+ EXTENDS_TK interface_type
+| extends_interfaces C_TK interface_type
+;
+
+interface_body:
+ OCB_TK CCB_TK
+| OCB_TK interface_member_declarations CCB_TK
+;
+
+interface_member_declarations:
+ interface_member_declaration
+| interface_member_declarations interface_member_declaration
+;
+
+interface_member_declaration:
+ constant_declaration
+| abstract_method_declaration
+| class_declaration /* Added, JDK1.1 inner classes */
+| interface_declaration /* Added, JDK1.1 inner classes */
+;
+
+constant_declaration:
+ field_declaration
+;
+
+abstract_method_declaration:
+ method_header SC_TK
+;
+
+/* 19.10 Productions from 10: Arrays */
+array_initializer:
+ OCB_TK CCB_TK
+| OCB_TK variable_initializers CCB_TK
+| OCB_TK C_TK CCB_TK
+| OCB_TK variable_initializers C_TK CCB_TK
+;
+
+variable_initializers:
+ variable_initializer
+| variable_initializers C_TK variable_initializer
+;
+
+/* 19.11 Production from 14: Blocks and Statements */
+block:
+ OCB_TK CCB_TK
+| OCB_TK block_statements CCB_TK
+;
+
+block_statements:
+ block_statement
+| block_statements block_statement
+;
+
+block_statement:
+ local_variable_declaration_statement
+| statement
+| class_declaration /* Added, JDK1.1 inner classes */
+;
+
+local_variable_declaration_statement:
+ local_variable_declaration SC_TK /* Can't catch missing ';' here */
+;
+
+local_variable_declaration:
+ type variable_declarators
+ { USE_ABSORBER; }
+| modifiers type variable_declarators /* Added, JDK1.1 final locals */
+ { modifier_value = 0; }
+;
+
+statement:
+ statement_without_trailing_substatement
+| labeled_statement
+| if_then_statement
+| if_then_else_statement
+| while_statement
+| for_statement
+;
+
+statement_nsi:
+ statement_without_trailing_substatement
+| labeled_statement_nsi
+| if_then_else_statement_nsi
+| while_statement_nsi
+| for_statement_nsi
+;
+
+statement_without_trailing_substatement:
+ block
+| empty_statement
+| expression_statement
+| switch_statement
+| do_statement
+| break_statement
+| continue_statement
+| return_statement
+| synchronized_statement
+| throw_statement
+| try_statement
+;
+
+empty_statement:
+ SC_TK
+;
+
+label_decl:
+ identifier REL_CL_TK
+ { USE_ABSORBER; }
+;
+
+labeled_statement:
+ label_decl statement
+;
+
+labeled_statement_nsi:
+ label_decl statement_nsi
+;
+
+/* We concentrate here a bunch of error handling rules that we couldn't write
+ earlier, because expression_statement catches a missing ';'. */
+expression_statement:
+ statement_expression SC_TK
+;
+
+statement_expression:
+ assignment
+| pre_increment_expression
+| pre_decrement_expression
+| post_increment_expression
+| post_decrement_expression
+| method_invocation
+| class_instance_creation_expression
+;
+
+if_then_statement:
+ IF_TK OP_TK expression CP_TK statement
+;
+
+if_then_else_statement:
+ IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement
+;
+
+if_then_else_statement_nsi:
+ IF_TK OP_TK expression CP_TK statement_nsi ELSE_TK statement_nsi
+;
+
+switch_statement:
+ SWITCH_TK OP_TK expression CP_TK switch_block
+;
+
+switch_block:
+ OCB_TK CCB_TK
+| OCB_TK switch_labels CCB_TK
+| OCB_TK switch_block_statement_groups CCB_TK
+| OCB_TK switch_block_statement_groups switch_labels CCB_TK
+;
+
+switch_block_statement_groups:
+ switch_block_statement_group
+| switch_block_statement_groups switch_block_statement_group
+;
+
+switch_block_statement_group:
+ switch_labels block_statements
+;
+
+
+switch_labels:
+ switch_label
+| switch_labels switch_label
+;
+
+switch_label:
+ CASE_TK constant_expression REL_CL_TK
+| DEFAULT_TK REL_CL_TK
+;
+
+while_expression:
+ WHILE_TK OP_TK expression CP_TK
+;
+
+while_statement:
+ while_expression statement
+;
+
+while_statement_nsi:
+ while_expression statement_nsi
+;
+
+do_statement_begin:
+ DO_TK
+;
+
+do_statement:
+ do_statement_begin statement WHILE_TK OP_TK expression CP_TK SC_TK
+;
+
+for_statement:
+ for_begin SC_TK expression SC_TK for_update CP_TK statement
+| for_begin SC_TK SC_TK for_update CP_TK statement
+;
+
+for_statement_nsi:
+ for_begin SC_TK expression SC_TK for_update CP_TK statement_nsi
+| for_begin SC_TK SC_TK for_update CP_TK statement_nsi
+;
+
+for_header:
+ FOR_TK OP_TK
+;
+
+for_begin:
+ for_header for_init
+;
+for_init: /* Can be empty */
+| statement_expression_list
+| local_variable_declaration
+;
+
+for_update: /* Can be empty */
+| statement_expression_list
+;
+
+statement_expression_list:
+ statement_expression
+| statement_expression_list C_TK statement_expression
+;
+
+break_statement:
+ BREAK_TK SC_TK
+| BREAK_TK identifier SC_TK
+;
+
+continue_statement:
+ CONTINUE_TK SC_TK
+| CONTINUE_TK identifier SC_TK
+;
+
+return_statement:
+ RETURN_TK SC_TK
+| RETURN_TK expression SC_TK
+;
+
+throw_statement:
+ THROW_TK expression SC_TK
+;
+
+synchronized_statement:
+ synchronized OP_TK expression CP_TK block
+| synchronized OP_TK expression CP_TK error
+;
+
+synchronized: /* Test lval.sub_token here */
+ MODIFIER_TK
+ { USE_ABSORBER; }
+;
+
+try_statement:
+ TRY_TK block catches
+| TRY_TK block finally
+| TRY_TK block catches finally
+;
+
+catches:
+ catch_clause
+| catches catch_clause
+;
+
+catch_clause:
+ CATCH_TK OP_TK formal_parameter CP_TK block
+;
+
+finally:
+ FINALLY_TK block
+;
+
+/* 19.12 Production from 15: Expressions */
+primary:
+ primary_no_new_array
+| array_creation_expression
+;
+
+primary_no_new_array:
+ literal
+| THIS_TK
+| OP_TK expression CP_TK
+| class_instance_creation_expression
+| field_access
+| method_invocation
+| array_access
+ /* type DOT_TK CLASS_TK doens't work. So we split the rule
+ 'type' into its components. Missing is something for array,
+ which will complete the reference_type part. FIXME */
+| name DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
+ { USE_ABSORBER; }
+| primitive_type DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
+ { USE_ABSORBER; }
+| VOID_TK DOT_TK CLASS_TK /* Added, JDK1.1 class literals */
+ /* Added, JDK1.1 inner classes. Documentation is wrong
+ refering to a 'ClassName' (class_name) rule that doesn't
+ exist. Used name instead. */
+| name DOT_TK THIS_TK
+ { USE_ABSORBER; }
+;
+
+class_instance_creation_expression:
+ NEW_TK class_type OP_TK argument_list CP_TK
+| NEW_TK class_type OP_TK CP_TK
+ /* Added, JDK1.1 inner classes but modified to use
+ 'class_type' instead of 'TypeName' (type_name) mentionned
+ in the documentation but doesn't exist. */
+| NEW_TK class_type OP_TK argument_list CP_TK class_body
+| NEW_TK class_type OP_TK CP_TK class_body
+ /* Added, JDK1.1 inner classes, modified to use name or
+ primary instead of primary solely which couldn't work in
+ all situations. */
+| something_dot_new identifier OP_TK CP_TK
+| something_dot_new identifier OP_TK CP_TK class_body
+| something_dot_new identifier OP_TK argument_list CP_TK
+| something_dot_new identifier OP_TK argument_list CP_TK class_body
+;
+
+something_dot_new: /* Added, not part of the specs. */
+ name DOT_TK NEW_TK
+ { USE_ABSORBER; }
+| primary DOT_TK NEW_TK
+;
+
+argument_list:
+ expression
+| argument_list C_TK expression
+| argument_list C_TK error
+;
+
+array_creation_expression:
+ NEW_TK primitive_type dim_exprs
+| NEW_TK class_or_interface_type dim_exprs
+| NEW_TK primitive_type dim_exprs dims
+| NEW_TK class_or_interface_type dim_exprs dims
+ /* Added, JDK1.1 anonymous array. Initial documentation rule
+ modified */
+| NEW_TK class_or_interface_type dims array_initializer
+| NEW_TK primitive_type dims array_initializer
+;
+
+dim_exprs:
+ dim_expr
+| dim_exprs dim_expr
+;
+
+dim_expr:
+ OSB_TK expression CSB_TK
+;
+
+dims:
+ OSB_TK CSB_TK
+| dims OSB_TK CSB_TK
+;
+
+field_access:
+ primary DOT_TK identifier
+| SUPER_TK DOT_TK identifier
+;
+
+method_invocation:
+ name OP_TK CP_TK
+ { USE_ABSORBER; }
+| name OP_TK argument_list CP_TK
+ { USE_ABSORBER; }
+| primary DOT_TK identifier OP_TK CP_TK
+| primary DOT_TK identifier OP_TK argument_list CP_TK
+| SUPER_TK DOT_TK identifier OP_TK CP_TK
+| SUPER_TK DOT_TK identifier OP_TK argument_list CP_TK
+;
+
+array_access:
+ name OSB_TK expression CSB_TK
+ { USE_ABSORBER; }
+| primary_no_new_array OSB_TK expression CSB_TK
+;
+
+postfix_expression:
+ primary
+| name
+ { USE_ABSORBER; }
+| post_increment_expression
+| post_decrement_expression
+;
+
+post_increment_expression:
+ postfix_expression INCR_TK
+;
+
+post_decrement_expression:
+ postfix_expression DECR_TK
+;
+
+unary_expression:
+ pre_increment_expression
+| pre_decrement_expression
+| PLUS_TK unary_expression
+| MINUS_TK unary_expression
+| unary_expression_not_plus_minus
+;
+
+pre_increment_expression:
+ INCR_TK unary_expression
+;
+
+pre_decrement_expression:
+ DECR_TK unary_expression
+;
+
+unary_expression_not_plus_minus:
+ postfix_expression
+| NOT_TK unary_expression
+| NEG_TK unary_expression
+| cast_expression
+;
+
+cast_expression: /* Error handling here is potentially weak */
+ OP_TK primitive_type dims CP_TK unary_expression
+| OP_TK primitive_type CP_TK unary_expression
+| OP_TK expression CP_TK unary_expression_not_plus_minus
+| OP_TK name dims CP_TK unary_expression_not_plus_minus
+;
+
+multiplicative_expression:
+ unary_expression
+| multiplicative_expression MULT_TK unary_expression
+| multiplicative_expression DIV_TK unary_expression
+| multiplicative_expression REM_TK unary_expression
+;
+
+additive_expression:
+ multiplicative_expression
+| additive_expression PLUS_TK multiplicative_expression
+| additive_expression MINUS_TK multiplicative_expression
+;
+
+shift_expression:
+ additive_expression
+| shift_expression LS_TK additive_expression
+| shift_expression SRS_TK additive_expression
+| shift_expression ZRS_TK additive_expression
+;
+
+relational_expression:
+ shift_expression
+| relational_expression LT_TK shift_expression
+| relational_expression GT_TK shift_expression
+| relational_expression LTE_TK shift_expression
+| relational_expression GTE_TK shift_expression
+| relational_expression INSTANCEOF_TK reference_type
+;
+
+equality_expression:
+ relational_expression
+| equality_expression EQ_TK relational_expression
+| equality_expression NEQ_TK relational_expression
+;
+
+and_expression:
+ equality_expression
+| and_expression AND_TK equality_expression
+;
+
+exclusive_or_expression:
+ and_expression
+| exclusive_or_expression XOR_TK and_expression
+;
+
+inclusive_or_expression:
+ exclusive_or_expression
+| inclusive_or_expression OR_TK exclusive_or_expression
+;
+
+conditional_and_expression:
+ inclusive_or_expression
+| conditional_and_expression BOOL_AND_TK inclusive_or_expression
+;
+
+conditional_or_expression:
+ conditional_and_expression
+| conditional_or_expression BOOL_OR_TK conditional_and_expression
+;
+
+conditional_expression: /* Error handling here is weak */
+ conditional_or_expression
+| conditional_or_expression REL_QM_TK expression REL_CL_TK conditional_expression
+;
+
+assignment_expression:
+ conditional_expression
+| assignment
+;
+
+assignment:
+ left_hand_side assignment_operator assignment_expression
+;
+
+left_hand_side:
+ name
+ { USE_ABSORBER; }
+| field_access
+| array_access
+;
+
+assignment_operator:
+ ASSIGN_ANY_TK
+| ASSIGN_TK
+;
+
+expression:
+ assignment_expression
+;
+
+constant_expression:
+ expression
+;
+
+%%
+
+#include "lex.c"
+
+/* Create a new parser context */
+
+void
+java_push_parser_context ()
+{
+ struct parser_ctxt *new =
+ (struct parser_ctxt *)xmalloc(sizeof (struct parser_ctxt));
+
+ bzero (new, sizeof (struct parser_ctxt));
+ new->next = ctxp;
+ ctxp = new;
+}
+
+/* Actions defined here */
+
+static void
+report_class_declaration (name)
+ char * name;
+{
+ extern int flag_dump_class, flag_list_filename;
+
+ if (flag_dump_class)
+ {
+ if (!previous_output)
+ {
+ if (flag_list_filename)
+ fprintf (out, "%s: ", input_filename);
+ previous_output = 1;
+ }
+
+ if (package_name)
+ fprintf (out, "%s.%s ", package_name, name);
+ else
+ fprintf (out, "%s ", name);
+ }
+
+ current_class = name;
+}
+
+static void
+report_main_declaration (declarator)
+ struct method_declarator *declarator;
+{
+ extern int flag_find_main;
+
+ if (flag_find_main
+ && modifier_value == 2
+ && !strcmp (declarator->method_name, "main")
+ && declarator->args
+ && declarator->args [0] == '['
+ && !strcmp( declarator->args+1, "String")
+ && current_class)
+ {
+ if (!previous_output)
+ {
+ if (package_name)
+ fprintf (out, "%s.%s ", package_name, current_class);
+ else
+ fprintf (out, current_class);
+ previous_output = 1;
+ }
+ }
+}
+
+/* Reset global status used by the report functions. */
+
+void reset_report ()
+{
+ previous_output = 0;
+ current_class = package_name = NULL;
+}
+
+void
+yyerror (msg)
+ char *msg;
+{
+}