/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1997--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
#include "warn.hh"
#include "program-option.hh"
-#include "ly-smobs.icc"
Lily_parser::Lily_parser (Sources *sources)
{
lexer_ = 0;
sources_ = sources;
default_duration_ = Duration (2, 0);
+ default_tremolo_type_ = 8;
error_level_ = 0;
closures_ = SCM_EOL;
}
Lily_parser::Lily_parser (Lily_parser const &src, SCM closures, SCM location)
+ : Smob<Lily_parser> ()
{
lexer_ = 0;
sources_ = src.sources_;
default_duration_ = src.default_duration_;
+ default_tremolo_type_ = src.default_tremolo_type_;
error_level_ = 0;
output_basename_ = src.output_basename_;
closures_ = closures;
}
SCM
-Lily_parser::mark_smob (SCM s)
+Lily_parser::mark_smob () const
{
- Lily_parser *parser = (Lily_parser *) SCM_CELL_WORD_1 (s);
- scm_gc_mark (parser->closures_);
- return (parser->lexer_) ? parser->lexer_->self_scm () : SCM_EOL;
+ scm_gc_mark (closures_);
+ return (lexer_) ? lexer_->self_scm () : SCM_EOL;
}
int
-Lily_parser::print_smob (SCM s, SCM port, scm_print_state *)
+Lily_parser::print_smob (SCM port, scm_print_state *) const
{
scm_puts ("#<Lily_parser ", port);
- Lily_parser *parser = (Lily_parser *) SCM_CELL_WORD_1 (s);
- if (parser->lexer_)
- scm_display (parser->lexer_->self_scm (), port);
+ if (lexer_)
+ scm_display (lexer_->self_scm (), port);
else
scm_puts ("(no lexer yet)", port);
scm_puts (" >", port);
void
Lily_parser::parse_file (const string &init, const string &name, const string &out_name)
{
- lexer_->set_identifier (ly_symbol2scm ("parser"), self_scm ());
output_basename_ = out_name;
lexer_->main_input_name_ = name;
}
while (!lexer_->is_clean ());
- /*
- Don't mix cyclic pointers with weak tables.
- */
- lexer_->set_identifier (ly_symbol2scm ("parser"),
- SCM_EOL);
ly_reexport_module (scm_current_module ());
scm_set_current_module (mod);
lexer_->new_input (lexer_->main_input_name_, ly_code, sources_);
SCM mod = lexer_->set_current_scope ();
- SCM parser = lexer_->lookup_identifier_symbol (ly_symbol2scm ("parser"));
- lexer_->set_identifier (ly_symbol2scm ("parser"), self_scm ());
+
do_yyparse ();
- lexer_->set_identifier (ly_symbol2scm ("parser"), parser);
+
scm_set_current_module (mod);
error_level_ = error_level_ | lexer_->error_level_;
lexer_->get_source_file ()->set_line (0, line);
}
SCM mod = lexer_->set_current_scope ();
- SCM parser = lexer_->lookup_identifier_symbol (ly_symbol2scm ("parser"));
- lexer_->set_identifier (ly_symbol2scm ("parser"), self_scm ());
+
lexer_->push_extra_token (Input (), EMBEDDED_LILY);
SCM result = do_yyparse ();
- lexer_->set_identifier (ly_symbol2scm ("parser"), parser);
scm_set_current_module (mod);
error_level_ = error_level_ | lexer_->error_level_;
lexer_ = 0;
}
-char const *
-Lily_parser::here_str0 () const
-{
- return lexer_->here_str0 ();
-}
-
void
Lily_parser::parser_error (const string &s)
{
- lexer_->here_input ().error (_ (s.c_str ()));
+ lexer_->here_input ().non_fatal_error (_ (s.c_str ()));
error_level_ = 1;
}
void
Lily_parser::parser_error (Input const &i, const string &s)
{
- i.error (s);
+ i.non_fatal_error (s);
error_level_ = 1;
}
-IMPLEMENT_SMOBS (Lily_parser);
-IMPLEMENT_TYPE_P (Lily_parser, "ly:lily-parser?");
-IMPLEMENT_DEFAULT_EQUAL_P (Lily_parser);
+const char * const Lily_parser::type_p_name_ = "ly:lily-parser?";
/****************************************************************
OUTPUT-DEF
get_layout (Lily_parser *parser)
{
SCM id = parser->lexer_->lookup_identifier ("$defaultlayout");
- Output_def *layout = unsmob_output_def (id);
+ Output_def *layout = unsmob<Output_def> (id);
layout = layout ? layout->clone () : new Output_def;
layout->set_variable (ly_symbol2scm ("is-layout"), SCM_BOOL_T);
get_midi (Lily_parser *parser)
{
SCM id = parser->lexer_->lookup_identifier ("$defaultmidi");
- Output_def *layout = unsmob_output_def (id);
+ Output_def *layout = unsmob<Output_def> (id);
layout = layout ? layout->clone () : new Output_def;
layout->set_variable (ly_symbol2scm ("is-midi"), SCM_BOOL_T);
return layout;
get_paper (Lily_parser *parser)
{
SCM papers = parser->lexer_->lookup_identifier ("$papers");
- Output_def *layout = ((papers == SCM_UNDEFINED) || scm_is_null (papers))
- ? 0 : unsmob_output_def (scm_car (papers));
+ Output_def *layout = (SCM_UNBNDP (papers) || scm_is_null (papers))
+ ? 0 : unsmob<Output_def> (scm_car (papers));
SCM default_paper = parser->lexer_->lookup_identifier ("$defaultpaper");
- layout = layout ? layout : unsmob_output_def (default_paper);
+ layout = layout ? layout : unsmob<Output_def> (default_paper);
layout = layout ? dynamic_cast<Output_def *> (layout->clone ()) : new Output_def;
layout->set_variable (ly_symbol2scm ("is-paper"), SCM_BOOL_T);