trunk preprocessor: fixed bug in the macro-processor, when the body of a @#for loop is empty
git-svn-id: https://www.dynare.org/svn/dynare/trunk@2399 ac1d8469-bf42-47a9-8791-bf33cf982152issue#70
parent
b62649a667
commit
1883643772
|
@ -56,13 +56,15 @@ private:
|
||||||
istream *input;
|
istream *input;
|
||||||
struct yy_buffer_state *buffer;
|
struct yy_buffer_state *buffer;
|
||||||
const Macro::parser::location_type yylloc;
|
const Macro::parser::location_type yylloc;
|
||||||
|
const bool is_for_context;
|
||||||
const string for_body;
|
const string for_body;
|
||||||
const Macro::parser::location_type for_body_loc;
|
const Macro::parser::location_type for_body_loc;
|
||||||
ScanContext(istream *input_arg, struct yy_buffer_state *buffer_arg,
|
ScanContext(istream *input_arg, struct yy_buffer_state *buffer_arg,
|
||||||
Macro::parser::location_type &yylloc_arg, const string &for_body_arg,
|
Macro::parser::location_type &yylloc_arg, bool is_for_context_arg,
|
||||||
|
const string &for_body_arg,
|
||||||
Macro::parser::location_type &for_body_loc_arg) :
|
Macro::parser::location_type &for_body_loc_arg) :
|
||||||
input(input_arg), buffer(buffer_arg), yylloc(yylloc_arg), for_body(for_body_arg),
|
input(input_arg), buffer(buffer_arg), yylloc(yylloc_arg), is_for_context(is_for_context_arg),
|
||||||
for_body_loc(for_body_loc_arg) { }
|
for_body(for_body_arg), for_body_loc(for_body_loc_arg) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
//! The stack used to keep track of nested scanning contexts
|
//! The stack used to keep track of nested scanning contexts
|
||||||
|
@ -75,7 +77,9 @@ private:
|
||||||
//! Should we omit the @#line statements ?
|
//! Should we omit the @#line statements ?
|
||||||
const bool no_line_macro;
|
const bool no_line_macro;
|
||||||
|
|
||||||
//! If current context is the body of a loop, contains the string of the loop body. Empty otherwise.
|
//! True iff current context is the body of a loop
|
||||||
|
bool is_for_context;
|
||||||
|
//! If current context is the body of a loop, contains the string of the loop body
|
||||||
string for_body;
|
string for_body;
|
||||||
//! If current context is the body of a loop, contains the location of the beginning of the body
|
//! If current context is the body of a loop, contains the location of the beginning of the body
|
||||||
Macro::parser::location_type for_body_loc;
|
Macro::parser::location_type for_body_loc;
|
||||||
|
|
|
@ -203,6 +203,7 @@ CONT \\\\
|
||||||
// Save old buffer state and location
|
// Save old buffer state and location
|
||||||
save_context(yylloc);
|
save_context(yylloc);
|
||||||
|
|
||||||
|
is_for_context = true;
|
||||||
for_body = for_body_tmp;
|
for_body = for_body_tmp;
|
||||||
for_body_loc = for_body_loc_tmp;
|
for_body_loc = for_body_loc_tmp;
|
||||||
|
|
||||||
|
@ -298,7 +299,7 @@ CONT \\\\
|
||||||
|
|
||||||
/* If we are not in a loop body, or if the loop has terminated,
|
/* If we are not in a loop body, or if the loop has terminated,
|
||||||
pop a context */
|
pop a context */
|
||||||
if (for_body.empty() || !iter_loop(driver, yylloc))
|
if (!is_for_context || !iter_loop(driver, yylloc))
|
||||||
restore_context(yylloc);
|
restore_context(yylloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,7 +329,8 @@ MacroFlex::output_line(Macro::parser::location_type *yylloc) const
|
||||||
void
|
void
|
||||||
MacroFlex::save_context(Macro::parser::location_type *yylloc)
|
MacroFlex::save_context(Macro::parser::location_type *yylloc)
|
||||||
{
|
{
|
||||||
context_stack.push(ScanContext(input, YY_CURRENT_BUFFER, *yylloc, for_body, for_body_loc));
|
context_stack.push(ScanContext(input, YY_CURRENT_BUFFER, *yylloc, is_for_context,
|
||||||
|
for_body, for_body_loc));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -337,6 +339,7 @@ MacroFlex::restore_context(Macro::parser::location_type *yylloc)
|
||||||
input = context_stack.top().input;
|
input = context_stack.top().input;
|
||||||
yy_switch_to_buffer(context_stack.top().buffer);
|
yy_switch_to_buffer(context_stack.top().buffer);
|
||||||
*yylloc = context_stack.top().yylloc;
|
*yylloc = context_stack.top().yylloc;
|
||||||
|
is_for_context = context_stack.top().is_for_context;
|
||||||
for_body = context_stack.top().for_body;
|
for_body = context_stack.top().for_body;
|
||||||
for_body_loc = context_stack.top().for_body_loc;
|
for_body_loc = context_stack.top().for_body_loc;
|
||||||
// Remove top of stack
|
// Remove top of stack
|
||||||
|
@ -359,6 +362,7 @@ MacroFlex::create_include_context(string *filename, Macro::parser::location_type
|
||||||
yylloc->begin.line = yylloc->end.line = 1;
|
yylloc->begin.line = yylloc->end.line = 1;
|
||||||
yylloc->begin.column = yylloc->end.column = 0;
|
yylloc->begin.column = yylloc->end.column = 0;
|
||||||
// We are not in a loop body
|
// We are not in a loop body
|
||||||
|
is_for_context = false;
|
||||||
for_body.clear();
|
for_body.clear();
|
||||||
// Output @#line information
|
// Output @#line information
|
||||||
output_line(yylloc);
|
output_line(yylloc);
|
||||||
|
@ -373,6 +377,7 @@ MacroFlex::create_then_context(Macro::parser::location_type *yylloc)
|
||||||
input = new stringstream(then_body_tmp);
|
input = new stringstream(then_body_tmp);
|
||||||
*yylloc = then_body_loc_tmp;
|
*yylloc = then_body_loc_tmp;
|
||||||
yylloc->begin.filename = yylloc->end.filename = new string(*then_body_loc_tmp.begin.filename);
|
yylloc->begin.filename = yylloc->end.filename = new string(*then_body_loc_tmp.begin.filename);
|
||||||
|
is_for_context = false;
|
||||||
for_body.clear();
|
for_body.clear();
|
||||||
output_line(yylloc);
|
output_line(yylloc);
|
||||||
yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE));
|
yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE));
|
||||||
|
@ -385,6 +390,7 @@ MacroFlex::create_else_context(Macro::parser::location_type *yylloc)
|
||||||
input = new stringstream(else_body_tmp);
|
input = new stringstream(else_body_tmp);
|
||||||
*yylloc = else_body_loc_tmp;
|
*yylloc = else_body_loc_tmp;
|
||||||
yylloc->begin.filename = yylloc->end.filename = new string(*else_body_loc_tmp.begin.filename);
|
yylloc->begin.filename = yylloc->end.filename = new string(*else_body_loc_tmp.begin.filename);
|
||||||
|
is_for_context = false;
|
||||||
for_body.clear();
|
for_body.clear();
|
||||||
output_line(yylloc);
|
output_line(yylloc);
|
||||||
yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE));
|
yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE));
|
||||||
|
|
Loading…
Reference in New Issue