2 my-lily-parser.cc -- implement My_lily_parser
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 Jan Nieuwenhuizen <janneke@gnu.org>
10 #include "my-lily-parser.hh"
11 #include "my-lily-lexer.hh"
15 #include "input-file-results.hh"
16 #include "scm-hash.hh"
18 My_lily_parser::My_lily_parser (Input_file_results
* source
)
22 default_duration_
= Duration (2,0);
24 last_beam_start_
= SCM_EOL
;
29 My_lily_parser::~My_lily_parser ()
33 scm_gc_unprotect_object (default_header_
->self_scm());
38 My_lily_parser::parse_file (String init
, String s
)
40 lexer_
= new My_lily_lexer
;
42 lexer_
->main_input_string_
= s
;
44 progress_indication (_ ("Parsing..."));
47 lexer_
->new_input (init
, &input_file_
->sources_
);
50 progress_indication ("\n");
52 if (!define_spots_
.empty ())
54 define_spots_
.top ().warning (_ ("Braces don't match"));
58 input_file_
->inclusion_names_
= lexer_
->filename_strings_
;
60 error_level_
= error_level_
| lexer_
->errorlevel_
; // ugh naming.
64 My_lily_parser::push_spot ()
66 define_spots_
.push (here_input ());
70 My_lily_parser::here_str0 () const
72 return lexer_
->here_str0 ();
76 My_lily_parser::parser_error (String s
)
78 here_input ().error (s
);
80 exit_status_global
= 1;
86 My_lily_parser::pop_spot ()
88 return define_spots_
.pop ();
92 My_lily_parser::here_input () const
95 Parsing looks ahead , so we really want the previous location of the
96 lexer, not lexer_->here_input().
99 Actually, that gets very icky when there are white space, because
100 the line-numbers are all wrong. Let's try the character before
101 the current token. That gets the right result for
102 note/duration stuff, but doesn't mess up for errors in the 1st token of the line.
105 Input
hi (lexer_
->here_input ());
107 char const * bla
= hi
.defined_str0_
;
108 if (hi
.line_number () > 1
109 || hi
.column_number () > 1)
112 return Input (hi
.source_file_
, bla
);
115 #include "paper-def.hh"
116 #include "translator-def.hh"
118 My_lily_parser
* current_parser
;
120 MAKE_SCHEME_CALLBACK (My_lily_parser
,paper_description
, 0);
123 My_lily_parser::paper_description ()
125 My_lily_parser
* me
= current_parser
;
127 Music_output_def
*id
= unsmob_music_output_def (me
->lexer_
->lookup_identifier ("$defaultpaper"));
128 Paper_def
*p
= dynamic_cast<Paper_def
*> (id
->clone ());
130 SCM al
= p
->translator_tab_
->to_alist ();
132 for (SCM s
= al
; gh_pair_p (s
); s
= ly_cdr (s
))
134 Translator_def
* td
= unsmob_translator_def (ly_cdar (s
));
135 l
= gh_cons (gh_cons (ly_caar (s
), td
->to_alist ()), l
);