From c45018bcab72634c34e43c7e510f270956fc1174 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Thu, 2 Jan 2014 00:57:15 +0100 Subject: [PATCH] Issue 3769: Lexer/Parser: Don't package location data in SCM_TOKEN semantic value As the location data is available as the location value in the parser anyway, there is no point in packaging it into the semantic value. Among other things, this leads to a cleaner display when using -ddebug-parser, and to better understandable code. --- lily/include/lily-lexer.hh | 8 +++-- lily/include/parse-scm.hh | 21 ++++-------- lily/lexer.ll | 26 +++++++-------- lily/parse-scm.cc | 65 ++++++++++++++++++++------------------ lily/parser.yy | 10 +++--- 5 files changed, 64 insertions(+), 66 deletions(-) diff --git a/lily/include/lily-lexer.hh b/lily/include/lily-lexer.hh index 4bc4cbe887..ff78cf9901 100644 --- a/lily/include/lily-lexer.hh +++ b/lily/include/lily-lexer.hh @@ -51,9 +51,13 @@ private: SCM start_module_; int hidden_state_; Input override_input_; - SCM eval_scm (SCM, char extra_token = 0); + SCM eval_scm (SCM, Input, char extra_token = 0); public: - SCM eval_scm_token (SCM sval) { return eval_scm (sval, '#'); } + SCM eval_scm_token (SCM sval, Input w) + { + w.step_forward (); + return eval_scm (sval, w, '#'); + } SCM extra_tokens_; SCM *lexval_; Input *lexloc_; diff --git a/lily/include/parse-scm.hh b/lily/include/parse-scm.hh index 047399a322..b39fa635ff 100644 --- a/lily/include/parse-scm.hh +++ b/lily/include/parse-scm.hh @@ -26,30 +26,23 @@ extern bool parse_protect_global; extern bool parsed_objects_should_be_dead; -struct Parse_start +class Parse_start { - char const *str; - int nchars; - Input start_location_; - bool safe_; - SCM (*func_) (Parse_start *ps); +public: SCM form_; + Input &location_; + bool safe_; Lily_parser *parser_; - Parse_start () + Parse_start (SCM form, Input &location, bool safe, Lily_parser *parser) : + form_ (form), location_ (location), safe_ (safe), parser_ (parser) { - str = 0; - nchars = 0; - safe_ = false; - parser_ = 0; - form_ = SCM_UNDEFINED; - func_ = 0; } }; SCM catch_protected_parse_body (void *); SCM protected_ly_parse_scm (Parse_start *, bool); -SCM ly_parse_scm (char const *, int *, Input, bool, Lily_parser *); +SCM ly_parse_scm (Input&, bool, Lily_parser *); SCM ly_eval_scm (SCM, Input, bool, Lily_parser *); #endif /* PARSE_SCM_HH */ diff --git a/lily/lexer.ll b/lily/lexer.ll index 3bad9f2e7e..9a5d781dce 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -361,12 +361,11 @@ BOM_UTF8 \357\273\277 } } (\$|#) { // scm for the filename - int n = 0; Input hi = here_input(); hi.step_forward (); - SCM sval = ly_parse_scm (hi.start (), &n, hi, - be_safe_global && is_main_input_, parser_); - sval = eval_scm (sval); + SCM sval = ly_parse_scm (hi, be_safe_global && is_main_input_, parser_); + sval = eval_scm (sval, hi); + int n = hi.end () - hi.start (); for (int i = 0; i < n; i++) { @@ -416,15 +415,14 @@ BOM_UTF8 \357\273\277 return MULTI_MEASURE_REST; } # { //embedded scm - int n = 0; Input hi = here_input(); hi.step_forward (); - SCM sval = ly_parse_scm (hi.start (), &n, hi, - be_safe_global && is_main_input_, parser_); + SCM sval = ly_parse_scm (hi, be_safe_global && is_main_input_, parser_); if (sval == SCM_UNDEFINED) error_level_ = 1; + int n = hi.end () - hi.start (); for (int i = 0; i < n; i++) { yyinput (); @@ -436,11 +434,11 @@ BOM_UTF8 \357\273\277 } \$ { //immediate scm - int n = 0; Input hi = here_input(); hi.step_forward (); - SCM sval = ly_parse_scm (hi.start (), &n, hi, - be_safe_global && is_main_input_, parser_); + SCM sval = ly_parse_scm (hi, be_safe_global && is_main_input_, parser_); + + int n = hi.end () - hi.start (); for (int i = 0; i < n; i++) { @@ -448,7 +446,7 @@ BOM_UTF8 \357\273\277 } char_count_stack_.back () += n; - sval = eval_scm (sval, '$'); + sval = eval_scm (sval, hi, '$'); int token = scan_scm_id (sval); if (!scm_is_eq (yylval, SCM_UNSPECIFIED)) @@ -1109,14 +1107,14 @@ Lily_lexer::is_figure_state () const // this function is private. SCM -Lily_lexer::eval_scm (SCM readerdata, char extra_token) +Lily_lexer::eval_scm (SCM readerdata, Input hi, char extra_token) { SCM sval = SCM_UNDEFINED; if (!SCM_UNBNDP (readerdata)) { - sval = ly_eval_scm (scm_car (readerdata), - *unsmob_input (scm_cdr (readerdata)), + sval = ly_eval_scm (readerdata, + hi, be_safe_global && is_main_input_, parser_); } diff --git a/lily/parse-scm.cc b/lily/parse-scm.cc index 44b99db2ad..25a60f7b36 100644 --- a/lily/parse-scm.cc +++ b/lily/parse-scm.cc @@ -36,16 +36,17 @@ using namespace std; SCM internal_ly_parse_scm (Parse_start *ps) { - Source_file *sf = ps->start_location_.get_source_file (); + Input &hi = ps->location_; + Source_file *sf = hi.get_source_file (); SCM port = sf->get_port (); - long off = ps->start_location_.start () - sf->c_str (); + long off = hi.start () - sf->c_str (); scm_seek (port, scm_from_long (off), scm_from_long (SEEK_SET)); SCM from = scm_ftell (port); - scm_set_port_line_x (port, scm_from_int (ps->start_location_.line_number () - 1)); - scm_set_port_column_x (port, scm_from_int (ps->start_location_.column_number () - 1)); + scm_set_port_line_x (port, scm_from_int (hi.line_number () - 1)); + scm_set_port_column_x (port, scm_from_int (hi.column_number () - 1)); bool multiple = ly_is_equal (scm_peek_char (port), SCM_MAKE_CHAR ('@')); @@ -55,7 +56,9 @@ internal_ly_parse_scm (Parse_start *ps) SCM form = scm_read (port); SCM to = scm_ftell (port); - ps->nchars = scm_to_int (to) - scm_to_int (from); + hi.set (hi.get_source_file (), + hi.start (), + hi.start () + scm_to_int (scm_difference (to, from))); if (!SCM_EOF_OBJECT_P (form)) { @@ -71,7 +74,7 @@ internal_ly_parse_scm (Parse_start *ps) form = scm_list_3 (ly_symbol2scm ("apply"), ly_symbol2scm ("values"), form); - return scm_cons (form, make_input (ps->start_location_)); + return form; } /* Don't close the port here; if we re-enter this function via a @@ -108,24 +111,25 @@ internal_ly_eval_scm (Parse_start *ps) SCM catch_protected_parse_body (void *p) { - Parse_start *ps = (Parse_start *) p; + return internal_ly_parse_scm (static_cast (p)); +} - return (*ps->func_) (ps); +SCM +catch_protected_eval_body (void *p) +{ + return internal_ly_eval_scm (static_cast (p)); } SCM -parse_handler (void *data, SCM tag, SCM args) +parse_handler (void *data, SCM /*tag*/, SCM args) { Parse_start *ps = (Parse_start *) data; - ps->start_location_.error (_ ("GUILE signaled an error for the expression beginning here")); + ps->location_.error (_ ("GUILE signaled an error for the expression beginning here")); if (scm_ilength (args) > 2) scm_display_error_message (scm_cadr (args), scm_caddr (args), scm_current_error_port ()); - if (tag == ly_symbol2scm ("read-error")) - ps->nchars = 1; - return SCM_UNDEFINED; } @@ -136,7 +140,19 @@ protected_ly_parse_scm (Parse_start *ps) Catch #t : catch all Scheme level errors. */ return scm_internal_catch (SCM_BOOL_T, - &catch_protected_parse_body, + catch_protected_parse_body, + (void *) ps, + &parse_handler, (void *) ps); +} + +SCM +protected_ly_eval_scm (Parse_start *ps) +{ + /* + Catch #t : catch all Scheme level errors. + */ + return scm_internal_catch (SCM_BOOL_T, + catch_protected_eval_body, (void *) ps, &parse_handler, (void *) ps); } @@ -147,19 +163,12 @@ bool parsed_objects_should_be_dead = false; /* Try parsing. Upon failure return SCM_UNDEFINED. */ SCM -ly_parse_scm (char const *s, int *n, Input i, bool safe, Lily_parser *parser) +ly_parse_scm (Input &i, bool safe, Lily_parser *parser) { - Parse_start ps; - ps.str = s; - ps.start_location_ = i; - ps.safe_ = safe; - ps.form_ = SCM_UNDEFINED; - ps.parser_ = parser; - ps.func_ = internal_ly_parse_scm; + Parse_start ps (SCM_UNDEFINED, i, safe, parser); SCM ans = parse_protect_global ? protected_ly_parse_scm (&ps) : internal_ly_parse_scm (&ps); - *n = ps.nchars; return ans; } @@ -167,15 +176,9 @@ ly_parse_scm (char const *s, int *n, Input i, bool safe, Lily_parser *parser) SCM ly_eval_scm (SCM form, Input i, bool safe, Lily_parser *parser) { - Parse_start ps; - ps.str = 0; - ps.start_location_ = i; - ps.safe_ = safe; - ps.form_ = form; - ps.parser_ = parser; - ps.func_ = internal_ly_eval_scm; + Parse_start ps (form, i, safe, parser); - SCM ans = parse_protect_global ? protected_ly_parse_scm (&ps) + SCM ans = parse_protect_global ? protected_ly_eval_scm (&ps) : internal_ly_eval_scm (&ps); scm_remember_upto_here_1 (form); return ans; diff --git a/lily/parser.yy b/lily/parser.yy index 592d9d2944..8417675baf 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -431,7 +431,7 @@ toplevel_expression: } | SCM_TOKEN { // Evaluate and ignore #xxx, as opposed to \xxx - parser->lexer_->eval_scm_token ($1); + parser->lexer_->eval_scm_token ($1, @1); } | embedded_scm_active { @@ -469,7 +469,7 @@ toplevel_expression: embedded_scm_bare: SCM_TOKEN { - $$ = parser->lexer_->eval_scm_token ($1); + $$ = parser->lexer_->eval_scm_token ($1, @1); } | SCM_IDENTIFIER ; @@ -483,7 +483,7 @@ embedded_scm_bare_arg: SCM_ARG | SCM_TOKEN { - $$ = parser->lexer_->eval_scm_token ($1); + $$ = parser->lexer_->eval_scm_token ($1, @1); } | FRACTION | full_markup_list @@ -751,7 +751,7 @@ book_body: } | book_body SCM_TOKEN { // Evaluate and ignore #xxx, as opposed to \xxx - parser->lexer_->eval_scm_token ($2); + parser->lexer_->eval_scm_token ($2, @2); } | book_body embedded_scm_active { @@ -821,7 +821,7 @@ bookpart_body: } | bookpart_body SCM_TOKEN { // Evaluate and ignore #xxx, as opposed to \xxx - parser->lexer_->eval_scm_token ($2); + parser->lexer_->eval_scm_token ($2, @2); } | bookpart_body embedded_scm_active { -- 2.39.5