From 54b33564fb8bda48bb437211cbf17526dc206578 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 d1150026da..10dbc48389 100644 --- a/lily/include/lily-lexer.hh +++ b/lily/include/lily-lexer.hh @@ -50,9 +50,13 @@ private: SCM scopes_; SCM start_module_; 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 5ed392d669..6234a84fec 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 ab6794a21e..66da124336 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -330,12 +330,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++) { @@ -385,15 +384,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 (); @@ -405,11 +403,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++) { @@ -417,7 +415,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)) @@ -1070,14 +1068,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 58348dc632..a8505fdec6 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 8ea6f1958d..c08442d75f 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -433,7 +433,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 { @@ -471,7 +471,7 @@ toplevel_expression: embedded_scm_bare: SCM_TOKEN { - $$ = parser->lexer_->eval_scm_token ($1); + $$ = parser->lexer_->eval_scm_token ($1, @1); } | SCM_IDENTIFIER ; @@ -485,7 +485,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 @@ -794,7 +794,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 { @@ -864,7 +864,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.2