-Input
-Lily_parser::pop_spot ()
-{
- return define_spots_.pop ();
-}
-
-Input
-Lily_parser::here_input () const
-{
- /*
- Parsing looks ahead , so we really want the previous location of the
- lexer, not lexer_->here_input ().
- */
-
- /*
- Actually, that gets very icky when there are white space, because
- the line-numbers are all wrong. Let's try the character before
- the current token. That gets the right result for note/duration
- stuff, but doesn't mess up for errors in the 1st token of the
- line.
- */
- Input hi (lexer_->here_input ());
-
- char const * bla = hi.defined_str0_;
- if (hi.line_number () > 1
- || hi.column_number () > 1)
- bla --;
-
- return Input (hi.source_file_, bla);
-}
-
-
-/****************************************************************/
-
-
-/*
- junkme?
- */
-bool store_locations_global_b;
-
-/* Do not append `!' suffix, since 1st argument is not modified. */
-LY_DEFINE (ly_set_point_and_click, "ly:set-point-and-click",
- 1, 0, 0, (SCM what),
- "Set the options for Point-and-click source specials output. The\n"
-"argument is a symbol. Possible options are @code{none} (no source specials),\n"
-"@code{line} and @code{line-column}")
-{
- /* UGH. */
- SCM val = SCM_BOOL_F;
- if (ly_symbol2scm ("line-column") == what)
- val = ly_lily_module_constant ("line-column-location");
- else if (what == ly_symbol2scm ("line"))
- val = ly_lily_module_constant ("line-location");
-
- scm_module_define (global_lily_module, ly_symbol2scm ("point-and-click"),
- val);
- store_locations_global_b = ly_c_procedure_p (val);
- return SCM_UNSPECIFIED;
-}
-
-LY_DEFINE (ly_parse_file, "ly:parse-file",
- 1, 0, 0, (SCM name),
- "Parse a single @code{.ly} file. "
- "Upon failure, throw @code{ly-file-failed} key.")
-{
- SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG1, __FUNCTION__, "string");
- char const *file = scm_i_string_chars (name);
- char const *extensions[] = {"ly", "", 0};
-
- String file_name = global_path.find (file, extensions);
-
- /* By default, use base name of input file for output file name,
- write output to cwd; do not use root and directory parts of input
- file name. */
- File_name out_file_name (file_name);
-
- global_path.append (out_file_name.dir_);
-
- out_file_name.ext_ = "";
- out_file_name.root_ = "";
- out_file_name.dir_ = "";
-
- if (!output_name_global.is_empty ())
- out_file_name = File_name (output_name_global);
-
- String init;
- if (!init_name_global.is_empty ())
- init = init_name_global;
- else
- init = "init.ly";
-
- String out_file = out_file_name.to_string ();
-
- if (init.length () && global_path.find (init).is_empty ())
- {
- warning (_f ("can't find init file: `%s'", init));
- warning (_f ("(search path: `%s')",
- global_path.to_string ().to_str0 ()));
- exit (2);
- }
-
- if ((file_name != "-") && global_path.find (file_name).is_empty ())
- {
- warning (_f ("can't find file: `%s'", file_name));
- scm_throw (ly_symbol2scm ("ly-file-failed"),
- scm_list_1 (scm_makfrom0str (file_name.to_str0 ())));
- }
- else
- {
- Sources sources;
- sources.set_path (&global_path);
-
- progress_indication (_f ("Processing `%s'", file_name.to_str0 ()));
- progress_indication ("\n");
-
- Lily_parser *parser = new Lily_parser (&sources);
-
- parser->parse_file (init, file_name, out_file);
-
- bool error = parser->error_level_;
- scm_gc_unprotect_object (parser->self_scm ());
- parser = 0;
- if (error)
- /* TODO: pass renamed input file too. */
- scm_throw (ly_symbol2scm ("ly-file-failed"),
- scm_list_1 (scm_makfrom0str (file_name.to_str0 ())));
- }
- return SCM_UNSPECIFIED;
-}
-
-LY_DEFINE (ly_parse_string, "ly:parse-string",
- 1, 0, 0, (SCM ly_code),
- "Parse the string LY_CODE. "
- "Upon failure, throw @code{ly-file-failed} key.")
-{
- SCM_ASSERT_TYPE (scm_is_string (ly_code), ly_code, SCM_ARG1, __FUNCTION__, "string");
-
- Sources sources;
- sources.set_path (&global_path);
- Lily_parser *parser = new Lily_parser (&sources);
- scm_module_define (global_lily_module, ly_symbol2scm ("parser"),
- parser->self_scm ());
- parser->parse_string (ly_scm2string (ly_code));
- scm_gc_unprotect_object (parser->self_scm ());
- parser = 0;
-
- return SCM_UNSPECIFIED;
-}
-
-LY_DEFINE (ly_clone_parser, "ly:clone-parser",
- 1, 0, 0, (SCM parser_smob),
- "Return a clone of PARSER_SMOB.")
-{
- Lily_parser *parser = unsmob_my_lily_parser (parser_smob);
- Lily_parser *clone = new Lily_parser (*parser);
-
- /* FIXME: should copy scopes too. */
- return scm_gc_unprotect_object (clone->self_scm ());
-}
-
-LY_DEFINE (ly_parser_define, "ly:parser-define",
- 3, 0, 0, (SCM parser_smob, SCM symbol, SCM val),
- "Bind SYMBOL to VAL in PARSER_SMOB's module.")