#include <cctype>
#include <sstream>
+using namespace std;
#include "scm-hash.hh"
#include "interval.hh"
scopes_ = SCM_EOL;
error_level_ = 0;
is_main_input_ = false;
-
+ start_module_ = SCM_EOL;
smobify_self ();
add_scope (ly_make_anonymous_module (false));
push_note_state (scm_c_make_hash_table (0));
- chordmodifier_tab_ = scm_make_vector (scm_int2num (1), SCM_EOL);
+ chordmodifier_tab_ = scm_make_vector (scm_from_int (1), SCM_EOL);
}
Lily_lexer::Lily_lexer (Lily_lexer const &src)
chordmodifier_tab_ = src.chordmodifier_tab_;
pitchname_tab_stack_ = src.pitchname_tab_stack_;
sources_ = src.sources_;
+ start_module_ = SCM_EOL;
error_level_ = src.error_level_;
is_main_input_ = src.is_main_input_;
Lily_lexer::add_scope (SCM module)
{
ly_reexport_module (scm_current_module ());
- scm_set_current_module (module);
+ if (!scm_is_pair (scopes_))
+ start_module_ = scm_current_module ();
+
for (SCM s = scopes_; scm_is_pair (s); s = scm_cdr (s))
- {
- ly_use_module (module, scm_car (s));
- }
+ ly_use_module (module, scm_car (s));
scopes_ = scm_cons (module, scopes_);
+
+ set_current_scope ();
}
SCM
{
SCM sc = scm_car (scopes_);
scopes_ = scm_cdr (scopes_);
- scm_set_current_module (scm_car (scopes_));
-
+ set_current_scope ();
return sc;
}
+SCM
+Lily_lexer::set_current_scope ()
+{
+ SCM old = scm_current_module ();
+
+ if (scm_is_pair (scopes_))
+ scm_set_current_module (scm_car (scopes_));
+ else
+ scm_set_current_module (start_module_);
+
+ return old;
+}
+
int
Lily_lexer::lookup_keyword (String s)
{
Input
Lily_lexer::here_input () const
{
- return Input(*lexloc);
+ return Input (*lexloc);
}
void
void
Lily_lexer::add_lexed_char (int count)
{
- lexloc->source_file_ = get_source_file ();
- lexloc->start_ = here_str0 ();
- lexloc->end_ = lexloc->start_ + count;
+ char const *start = here_str0 ();
+ lexloc->set (get_source_file (),
+ start, start + count);
char_count_stack_.top () += count;
}
scm_gc_mark (lexer->chordmodifier_tab_);
scm_gc_mark (lexer->pitchname_tab_stack_);
+ scm_gc_mark (lexer->start_module_);
return lexer->scopes_;
}
int
-Lily_lexer::print_smob (SCM, SCM port, scm_print_state*)
+Lily_lexer::print_smob (SCM s, SCM port, scm_print_state*)
{
+ Lily_lexer *lexer = Lily_lexer::unsmob (s);
+
scm_puts ("#<Lily_lexer ", port);
+ scm_display (lexer->scopes_, port);
scm_puts (" >", port);
return 1;
}