diff options
author | Per Bothner <per@bothner.com> | 2004-09-30 16:35:07 -0700 |
---|---|---|
committer | Per Bothner <bothner@gcc.gnu.org> | 2004-09-30 16:35:07 -0700 |
commit | 9ec819d49ca815551b3fd8cd4e1202e898bac8d5 (patch) | |
tree | d3e8024e8ba3df366d03490e5511ea3378e8ed60 /gcc/java/parse.h | |
parent | cb3a14307a07a4f9d719f229caff8c47aed42624 (diff) | |
download | gcc-9ec819d49ca815551b3fd8cd4e1202e898bac8d5.zip gcc-9ec819d49ca815551b3fd8cd4e1202e898bac8d5.tar.gz gcc-9ec819d49ca815551b3fd8cd4e1202e898bac8d5.tar.bz2 |
Simplify lexer. Implement --enable-mapped-location support.
* jcf-parse.c (parse_class_file): Use linemap_line_start.
(parse_source_file_1): Pass filename as extra parameter, so we can call
linemap_add and set input_location here, rather than in both callers.
(read_class): Pass copied filename to parse_source_file_1.
Don't initialize wfl_operator - only needed for source compilation.
(read_class, jcf_parse): Call linemap_add with LC_LEAVE.
* lex.h: Remove a bunch of debugging macros.
* lex.h (struct_java_line, struct java_error): Remove types.
(JAVA_COLUMN_DELTA): Remove - use java_lexer.next_colums instead.
(struct java_lc_s): Remove prev_col field.
(struct java_lexer): New fields next_unicode, next_columns, and
avail_unicode. New position field, and maybe token_start field.
Don't need hit_eof field - use next_unicode == -1 instead.
(JAVA_INTEGERAL_RANGE_ERROR): Rename to JAVA_RANGE_ERROR.
(JAVA_RANGE_ERROR, JAVA_FLOAT_ANGE_ERROR): Update accordingly.
* parse.h: Various changes for USE_MAPPED_LOCATION.
(EXPR_WFL_EMIT_LINE_NOTE): XXX
(BUILD_EXPR_WFL, EXPR_WFL_ADD_COL): Remove no-longer-used macros.
(struct parser_ctxt): New file_start_location field.
Remove p_line, c_line fields since we no longer save lines.
Remove elc, lineno, and current_jcf fields - no longer used.
* parse.y: Updates for USE_MAPPED_LOCATION and new lexer.
Don't use EXPR_WFL_ADD_COL since that isn't trivial with
source_location and is probably not needed anymore anyway.
Use new expr_add_Location function.
(SET_EXPR_LOCATION_FROM_TOKEN): New convenience macro.
(java_pop_parser_context): Minor cleanup.
(java_parser_context_save_global, java_parser_context_restore_global,
java_pop_parser_context): Save/restore input_location as a unit.
(issue_warning_error_from_context): If USE_MAPPED_LOCATION take
a source_location instead of a wfl context node.
(check_class_interface_creation): input_filename is not addressable.
(create_artificial_method): Calling java_parser_context_save_global
and java_parser_context_restore_global is overkill. Instead,
temporarily set input_location from class decl.
(java_layout_seen_class_methods): Set input_location from method decl.
(fix_constructors): Make more robust if no EXPR_WITH_FILE_LOCATION.
(finish_loop_body): Likewise.
* lex.c: Updates for USE_MAPPED_LOCATION. Use build_unknwon_wfl.
(java_sprint_unicode): Take a character, not index in line.
(java_sneak_uncode): Replaced by java_peek_unicode.
(java_unget_unicode): No longer used.
(java_allocate_new_line. java_store_unicode): Removed, since we
no longer remember "lines".
(java_new_lexer): Update for new data structures.
(java_read_char): Move unget_value checking to java_read_unicode.
(java_get_unicode, java_peek_unicode, java_next_unicode): New more
efficient functions that are used directly when lexing.
(java_read_unicode_collapsing_terminators): No longer needed.
(java_parse_end_comment, java_parse_escape_sequence, do_java_lex):
Re-organize to use java_peek_unicode to avoid java_unget_unicode.
(java_parse_escape_sequence): Rewrite to be simpler / more efficient.
(do_java_lex): Lots of movings around to avoid java_unget_unicode,
combine switch branches, and test for common token kinds earlier.
(java_lex_error): Rewrite.
* jv-scan.c (expand_location): New function, copied from tree.c.
(main): Set ctxp->filename instead of setting input_filename directly.
From-SVN: r88367
Diffstat (limited to 'gcc/java/parse.h')
-rw-r--r-- | gcc/java/parse.h | 61 |
1 files changed, 40 insertions, 21 deletions
diff --git a/gcc/java/parse.h b/gcc/java/parse.h index 95e4b23..b83d22e 100644 --- a/gcc/java/parse.h +++ b/gcc/java/parse.h @@ -89,6 +89,23 @@ extern tree stabilize_reference (tree); #define MODIFIER_WFL(M) (ctxp->modifier_ctx [(M) - PUBLIC_TK]) /* Check on modifiers */ +#ifdef USE_MAPPED_LOCATION +#define THIS_MODIFIER_ONLY(f, m, v, count, l) \ + if ((f) & (m)) \ + { \ + tree node = MODIFIER_WFL (v); \ + if (!l) \ + l = node; \ + else \ + { \ + expanded_location lloc = expand_location (EXPR_LOCATION (l)); \ + expanded_location nloc = expand_location (EXPR_LOCATION (node)); \ + if (nloc.column > lloc.column || nloc.line > lloc.line) \ + l = node; \ + } \ + count++; \ + } +#else #define THIS_MODIFIER_ONLY(f, m, v, count, l) \ if ((f) & (m)) \ { \ @@ -101,6 +118,7 @@ extern tree stabilize_reference (tree); l = node; \ count++; \ } +#endif #define ABSTRACT_CHECK(FLAG, V, CL, S) \ if ((FLAG) & (V)) \ @@ -163,11 +181,13 @@ extern tree stabilize_reference (tree); && !TREE_TYPE (NODE) \ && TREE_CODE (TYPE_NAME (NODE)) == IDENTIFIER_NODE) +#ifndef USE_MAPPED_LOCATION /* Set the EMIT_LINE_NOTE flag of a EXPR_WLF to 1 if debug information are requested. Works in the context of a parser rule. */ #define JAVA_MAYBE_GENERATE_DEBUG_INFO(node) \ - (debug_info_level != DINFO_LEVEL_NONE ? \ - EXPR_WFL_EMIT_LINE_NOTE (node) = 1, node : node) + do {if (debug_info_level != DINFO_LEVEL_NONE) \ + EXPR_WFL_EMIT_LINE_NOTE (node) = 1; } while (0) +#endif /* Types classification, according to the JLS, section 4.2 */ #define JFLOAT_TYPE_P(TYPE) (TYPE && TREE_CODE ((TYPE)) == REAL_TYPE) @@ -610,20 +630,14 @@ typedef struct jdeplist_s jdeplist; #define GET_CURRENT_BLOCK(F) ((F) ? DECL_FUNCTION_BODY ((F)) : \ current_static_block) +#ifndef USE_MAPPED_LOCATION /* Retrieve line/column from a WFL. */ #define EXPR_WFL_GET_LINECOL(V,LINE,COL) \ { \ (LINE) = (V) >> 12; \ (COL) = (V) & 0xfff; \ } -/* Add X to the column number information */ -#define EXPR_WFL_ADD_COL(V, X) \ - (V) = (((V) & 0xfffff000) | ((((V) & 0xfff) + (X)) & 0xfff)) - -/* Build a WFL for expression nodes */ -#define BUILD_EXPR_WFL(NODE, WFL) \ - build_expr_wfl ((NODE), input_filename, EXPR_WFL_LINENO ((WFL)), \ - EXPR_WFL_COLNO ((WFL))) +#endif #define EXPR_WFL_QUALIFICATION(WFL) TREE_OPERAND ((WFL), 1) #define QUAL_WFL(NODE) TREE_PURPOSE (NODE) @@ -671,10 +685,17 @@ typedef struct jdeplist_s jdeplist; } /* Set wfl_operator for the most accurate error location */ +#ifdef USE_MAPPED_LOCATION +#define SET_WFL_OPERATOR(WHICH, NODE, WFL) \ + SET_EXPR_LOCATION (WHICH, \ + (TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \ + EXPR_LOCATION (WFL) : EXPR_LOCATION (NODE))) +#else #define SET_WFL_OPERATOR(WHICH, NODE, WFL) \ EXPR_WFL_LINECOL (WHICH) = \ (TREE_CODE (WFL) == EXPR_WITH_FILE_LOCATION ? \ EXPR_WFL_LINECOL (WFL) : EXPR_WFL_LINECOL (NODE)) +#endif #define PATCH_METHOD_RETURN_ERROR() \ { \ @@ -724,23 +745,23 @@ typedef struct jdeplist_s jdeplist; /* Parser context data structure. */ struct parser_ctxt GTY(()) { - - const char *filename; /* Current filename */ + const char *filename; /* Current filename */ + location_t file_start_location; + location_t save_location; struct parser_ctxt *next; java_lexer * GTY((skip)) lexer; /* Current lexer state */ char marker_begining; /* Marker. Should be a sub-struct */ - struct java_line * GTY ((skip)) p_line; /* Previous line */ - struct java_line * GTY ((skip)) c_line; /* Current line */ - java_lc elc; /* Error's line column info */ - int ccb_indent; /* Keep track of {} indent, lexer */ - int first_ccb_indent1; /* First { at ident level 1 */ - int last_ccb_indent1; /* Last } at ident level 1 */ + int ccb_indent; /* Number of unmatched { seen. */ + /* The next two fields are only source_location if USE_MAPPED_LOCATION. + Otherwise, they are integer line number, but we can't have #ifdefs + in GTY structures. */ + source_location first_ccb_indent1; /* First { at ident level 1 */ + source_location last_ccb_indent1; /* Last } at ident level 1 */ int parser_ccb_indent; /* Keep track of {} indent, parser */ int osb_depth; /* Current depth of [ in an expression */ int osb_limit; /* Limit of this depth */ int * GTY ((skip)) osb_number; /* Keep track of ['s */ - int lineno; /* Current lineno */ char marker_end; /* End marker. Should be a sub-struct */ /* The flags section */ @@ -763,8 +784,6 @@ struct parser_ctxt GTY(()) { tree class_type; /* Current class */ tree function_decl; /* Current function decl, save/restore */ - struct JCF * current_jcf; /* CU jcf */ - int prevent_ese; /* Prevent expression statement error */ int formal_parameter_number; /* Number of parameters found */ |