]> git.donarmstrong.com Git - lilypond.git/blob - lily/my-lily-parser.cc
release: 0.0.44
[lilypond.git] / lily / my-lily-parser.cc
1 /*
2   my-lily-parser.cc -- implement 
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "my-lily-parser.hh"
10 #include "my-lily-lexer.hh"
11 #include "debug.hh"
12 #include "main.hh"
13 #include "voice-element.hh"
14 #include "musical-request.hh"
15 #include "command-request.hh"
16
17 void
18 My_lily_parser::set_debug()
19 {
20 #ifndef NPRINT
21     String s = "";
22     if (init_parse_b_) 
23         s = "Init";
24     set_yydebug( !monitor->silence(s+"Parser") && check_debug);
25     lexer_p_->set_debug( !monitor->silence(s+"Lexer") && check_debug);
26 #endif
27 }
28 void
29 My_lily_parser::print_declarations()
30 {
31 #ifndef NPRINT
32     String s = "";
33     if (init_parse_b_) 
34         s = "Init";
35     if (!monitor->silence(s+"Declarations") && check_debug) {
36         lexer_p_->print_declarations(init_parse_b_);
37     }
38 #endif   
39 }
40
41 void
42 My_lily_parser::parse_file(String init, String s)
43 {
44     *mlog << "Parsing ... ";
45     lexer_p_ = new My_lily_lexer;
46
47     set_debug();
48
49     lexer_p_->new_input(init, source_l_);
50     do_yyparse();
51     print_declarations();
52    
53     init_parse_b_ = false;
54     lexer_p_->new_input(s, source_l_);
55     do_yyparse();
56
57
58     if(!define_spot_array_.empty())
59         warning("Braces don't match.",0);
60 }
61
62 My_lily_parser::~My_lily_parser()
63 {
64     delete lexer_p_;
65 }
66     
67 void
68 My_lily_parser::remember_spot()
69 {
70     define_spot_array_.push(here_ch_C());
71 }
72
73 char const * 
74 My_lily_parser::here_ch_C()const
75 {
76     return lexer_p_->here_ch_C();
77 }
78
79 void
80 My_lily_parser::parser_error(String s)
81 {
82     lexer_p_->LexerError(s);
83
84     if ( fatal_error_i_ )
85         exit( fatal_error_i_ );
86     error_level_i_ = 1;
87 }
88
89 void
90 My_lily_parser::set_duration_mode(String s)
91 {
92     s = s.upper_str();
93     last_duration_mode = (s== "LAST");
94 }
95
96 void
97 My_lily_parser::set_last_duration(Duration const *d)
98 {
99     if (last_duration_mode)
100         default_duration_ = *d;
101 }
102
103
104 Voice_element*
105 My_lily_parser::get_word_element(Text_def* tdef_p, Duration * duration_p)
106 {
107     Voice_element* velt_p = new Voice_element;
108     
109     Lyric_req* lreq_p = new Lyric_req(tdef_p);
110
111     lreq_p->duration_ = *duration_p;
112     lreq_p->print();
113     lreq_p->defined_ch_C_ = here_ch_C();
114
115     velt_p->add(lreq_p);
116
117     delete  duration_p;
118     return velt_p;
119 }
120
121 Voice_element *
122 My_lily_parser::get_rest_element(String,  Duration * duration_p )
123 {    
124     Voice_element* velt_p = new Voice_element;
125     velt_p->defined_ch_C_ = lexer_p_->here_ch_C();
126
127     Rest_req * rest_req_p = new Rest_req;
128     rest_req_p->duration_ = *duration_p;
129     rest_req_p->print();
130     rest_req_p->defined_ch_C_ = here_ch_C();
131
132     velt_p->add(rest_req_p);
133     delete duration_p;
134     return velt_p;
135 }
136
137 Voice_element *
138 My_lily_parser::get_note_element(Note_req *rq, Duration * duration_p )
139 {
140     Voice_element*v = new Voice_element;
141     v->defined_ch_C_ = here_ch_C();
142     
143     if (duration_p->type_i_ >= 2) {
144         Stem_req * stem_req_p = new Stem_req();
145         stem_req_p->duration_ = *duration_p;
146         
147         stem_req_p->defined_ch_C_ = here_ch_C();
148         v->add(stem_req_p);
149     }
150
151     rq->set_duration(*duration_p);
152     rq->defined_ch_C_ = here_ch_C();
153
154
155     v->add(rq);
156     delete duration_p ;
157     return v;
158 }
159
160 Request*
161 My_lily_parser::get_parens_request(char c)
162 {
163     Request* req_p=0;
164     switch (c) {
165     case '|':
166         req_p = new Barcheck_req;
167         break;
168
169     case '[':
170     case ']':
171     {
172         Beam_req*b = new Beam_req;
173         int p_i=default_duration_.plet_.type_i_ ; // ugh . Should junk?
174         if (p_i!= 1)
175             b->nplet = p_i;
176         req_p = b;
177     }
178     break;
179
180
181     case ')':
182     case '(':
183         req_p = new Slur_req;
184         break;
185     default:
186         assert(false);
187         break;
188     }
189     
190     switch (c) {
191     case '(':
192     case '[':
193         req_p->span()->spantype = Span_req::START;
194         break;
195     case ')':
196     case ']':
197         req_p->span()->spantype = Span_req::STOP;
198         break;
199         
200     default:
201         break;
202     }
203
204     req_p->defined_ch_C_ = here_ch_C();
205     return req_p;
206 }
207
208 My_lily_parser::My_lily_parser(Sources * source_l)
209 {
210     source_l_ = source_l;
211     lexer_p_ = 0;
212     default_duration_.type_i_ = 4;
213     default_octave_i_=0;
214     textstyle_str_="roman";             // in lexer?
215     error_level_i_ = 0;
216     last_duration_mode = false;
217     defined_ch_C_ = 0;
218     fatal_error_i_ = 0;
219 }
220
221 void
222 My_lily_parser::add_requests(Voice_element*v)
223 {
224     for (int i = 0; i < pre_reqs.size(); i++) {
225         v->add(pre_reqs[i]);
226     }
227     pre_reqs.set_size(0);
228     for (int i = 0; i <post_reqs.size(); i++) {
229         v->add(post_reqs[i]);
230     }
231     post_reqs.set_size(0);
232 }