From 8b7201ac17ca93c91ea5957b36027950898f263b Mon Sep 17 00:00:00 2001 From: sebastien <sebastien@ac1d8469-bf42-47a9-8791-bf33cf982152> Date: Thu, 10 Apr 2008 08:16:54 +0000 Subject: [PATCH] v4 preprocessor/macro: changed escape character one more time. New syntax: * directives: @#include "filename.mod" * expressions to be substituted: @{expr} git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@1788 ac1d8469-bf42-47a9-8791-bf33cf982152 --- DynareFlex.ll | 2 +- macro/MacroBison.yy | 6 ++--- macro/MacroDriver.cc | 8 +++---- macro/MacroDriver.hh | 14 +++++------ macro/MacroFlex.ll | 56 ++++++++++++++++++++------------------------ 5 files changed, 40 insertions(+), 46 deletions(-) diff --git a/DynareFlex.ll b/DynareFlex.ll index 7cf77768..51ca086c 100644 --- a/DynareFlex.ll +++ b/DynareFlex.ll @@ -71,7 +71,7 @@ int sigma_e = 0; %} /* Rules for matching $line directives */ -<*>^\$line\ \" { line_caller = YYSTATE; BEGIN(LINE1); } +<*>^@#line\ \" { line_caller = YYSTATE; BEGIN(LINE1); } <LINE1>[^\"]* { if (yylloc->begin.filename) delete yylloc->begin.filename; diff --git a/macro/MacroBison.yy b/macro/MacroBison.yy index be9c41d4..06465c48 100644 --- a/macro/MacroBison.yy +++ b/macro/MacroBison.yy @@ -40,8 +40,8 @@ class MacroDriver; { // Initialize the location filenames @$.begin.filename = @$.end.filename = &driver.file; - // Output first $line statement - out << "$line \"" << driver.file << "\" 1" << endl; + // Output first @#line statement + out << "@#line \"" << driver.file << "\" 1" << endl; }; %debug @@ -118,7 +118,7 @@ statement : expr | ERROR expr { TYPERR_CATCH(driver.error(@$, $2), @$); } | LINE STRING INTEGER - /* Ignore $line declarations */ + /* Ignore @#line declarations */ ; expr : INTEGER diff --git a/macro/MacroDriver.cc b/macro/MacroDriver.cc index 98875a00..cd6b11c2 100644 --- a/macro/MacroDriver.cc +++ b/macro/MacroDriver.cc @@ -83,7 +83,7 @@ MacroDriver::init_loop(const string &name, const MacroValue *value) throw (Macro const ArrayMV<int> *mv1 = dynamic_cast<const ArrayMV<int> *>(value); const ArrayMV<string> *mv2 = dynamic_cast<const ArrayMV<string> *>(value); if (!mv1 && !mv2) - throw MacroValue::TypeError("Argument of $for loop must be an array expression"); + throw MacroValue::TypeError("Argument of @#for loop must be an array expression"); loop_stack.push(make_pair(name, make_pair(value, 0))); } @@ -132,7 +132,7 @@ MacroDriver::begin_if(const MacroValue *value) throw (MacroValue::TypeError) { const IntMV *ival = dynamic_cast<const IntMV *>(value); if (!ival) - throw MacroValue::TypeError("Argument of $if must be an integer"); + throw MacroValue::TypeError("Argument of @#if must be an integer"); last_if = (bool) ival->value; } @@ -141,7 +141,7 @@ MacroDriver::echo(const Macro::parser::location_type &l, const MacroValue *value { const StringMV *sval = dynamic_cast<const StringMV *>(value); if (!sval) - throw MacroValue::TypeError("Argument of $echo must be a string"); + throw MacroValue::TypeError("Argument of @#echo must be a string"); cerr << "ECHO in macro-processor: " << l << ": " << sval->value << endl; } @@ -151,7 +151,7 @@ MacroDriver::error(const Macro::parser::location_type &l, const MacroValue *valu { const StringMV *sval = dynamic_cast<const StringMV *>(value); if (!sval) - throw MacroValue::TypeError("Argument of $error must be a string"); + throw MacroValue::TypeError("Argument of @#error must be a string"); error(l, sval->value); } diff --git a/macro/MacroDriver.hh b/macro/MacroDriver.hh index 37985d32..cb8a29e2 100644 --- a/macro/MacroDriver.hh +++ b/macro/MacroDriver.hh @@ -81,12 +81,12 @@ private: string for_body_tmp; //! Temporary variable used in FOR_BODY mode Macro::parser::location_type for_body_loc_tmp; - //! Temporary variable used in FOR_BODY mode. Keeps track of number of nested $for/$endfor + //! Temporary variable used in FOR_BODY mode. Keeps track of number of nested @#for/@#endfor int nested_for_nb; //! Set to true while parsing a FOR statement (only the statement, not the loop body) bool reading_for_statement; - //! Temporary variable used in THEN_BODY and ELSE_BODY modes. Keeps track of number of nested $if + //! Temporary variable used in THEN_BODY and ELSE_BODY modes. Keeps track of number of nested @#if int nested_if_nb; //! Temporary variable used in THEN_BODY mode string then_body_tmp; @@ -99,7 +99,7 @@ private: //! Set to true while parsing an IF statement (only the statement, not the body) bool reading_if_statement; - //! Output the $line declaration + //! Output the @#line declaration void output_line(Macro::parser::location_type *yylloc) const; //! Save current scanning context @@ -170,7 +170,7 @@ public: //! Reference to the lexer class MacroFlex *lexer; - //! Used to store the value of the last $if condition + //! Used to store the value of the last @#if condition bool last_if; //! Error handler @@ -191,13 +191,13 @@ public: /*! Returns false if iteration is no more possible (end of loop); in that case it destroys the pointer given to init_loop() */ bool iter_loop(); - //! Begins an $if statement + //! Begins an @#if statement void begin_if(const MacroValue *value) throw (MacroValue::TypeError); - //! Executes $echo directive + //! Executes @#echo directive void echo(const Macro::parser::location_type &l, const MacroValue *value) const throw (MacroValue::TypeError); - //! Executes $error directive + //! Executes @#error directive void error(const Macro::parser::location_type &l, const MacroValue *value) const throw (MacroValue::TypeError); }; diff --git a/macro/MacroFlex.ll b/macro/MacroFlex.ll index 84ffc3b3..df7e1c5f 100644 --- a/macro/MacroFlex.ll +++ b/macro/MacroFlex.ll @@ -69,7 +69,7 @@ CONT \\\\ yylloc->step(); %} -<INITIAL>^{SPC}*\${SPC}*include{SPC}+\"[^\"\r\n]*\"{SPC}*{EOL} { +<INITIAL>^{SPC}*@#{SPC}*include{SPC}+\"[^\"\r\n]*\"{SPC}*{EOL} { yylloc->lines(1); yylloc->step(); @@ -85,8 +85,8 @@ CONT \\\\ BEGIN(INITIAL); } -<INITIAL>^{SPC}*\$ { yylloc->step(); BEGIN(STMT); } -<INITIAL>\$\{ { yylloc->step(); BEGIN(EXPR); } +<INITIAL>^{SPC}*@# { yylloc->step(); BEGIN(STMT); } +<INITIAL>@\{ { yylloc->step(); BEGIN(EXPR); } <EXPR>\} { BEGIN(INITIAL); return token::EOL; } @@ -156,11 +156,11 @@ CONT \\\\ <STMT>for { reading_for_statement = true; return token::FOR; } <STMT>in { return token::IN; } -<STMT>endfor { driver.error(*yylloc, "$endfor is not matched by a $for statement"); } +<STMT>endfor { driver.error(*yylloc, "@#endfor is not matched by a @#for statement"); } <STMT>if { reading_if_statement = true; return token::IF; } -<STMT>else { driver.error(*yylloc, "$else is not matched by an $if statement"); } -<STMT>endif { driver.error(*yylloc, "$endif is not matched by an $if statement"); } +<STMT>else { driver.error(*yylloc, "@#else is not matched by an @#if statement"); } +<STMT>endif { driver.error(*yylloc, "@#endif is not matched by an @#if statement"); } <STMT>echo { return token::ECHO_DIR; } <STMT>error { return token::ERROR; } @@ -174,22 +174,20 @@ CONT \\\\ <STMT><<EOF>> { driver.error(*yylloc, "Unexpected end of file while parsing a macro statement"); } <FOR_BODY>{EOL} { yylloc->lines(1); yylloc->step(); for_body_tmp.append(yytext); } -<FOR_BODY>^{SPC}*\${SPC}*for({SPC}|{CONT}) { - /* In order to catch nested $for, it is necessary to start from the beginning of - the line (otherwise we could catch something like "${var} for" */ +<FOR_BODY>^{SPC}*@#{SPC}*for({SPC}|{CONT}) { nested_for_nb++; for_body_tmp.append(yytext); yylloc->step(); } <FOR_BODY>. { for_body_tmp.append(yytext); yylloc->step(); } -<FOR_BODY><<EOF>> { driver.error(*yylloc, "Unexpected end of file: $for loop not matched by an $endfor"); } -<FOR_BODY>^{SPC}*\${SPC}*endfor{SPC}*{EOL} { +<FOR_BODY><<EOF>> { driver.error(*yylloc, "Unexpected end of file: @#for loop not matched by an @#endfor"); } +<FOR_BODY>^{SPC}*@#{SPC}*endfor{SPC}*{EOL} { yylloc->lines(1); yylloc->step(); if (nested_for_nb) { - /* This $endfor is not the end of the loop body, - but only that of a nested $for loop */ + /* This @#endfor is not the end of the loop body, + but only that of a nested @#for loop */ nested_for_nb--; for_body_tmp.append(yytext); } @@ -208,16 +206,14 @@ CONT \\\\ } <THEN_BODY>{EOL} { yylloc->lines(1); yylloc->step(); then_body_tmp.append(yytext); } -<THEN_BODY>^{SPC}*\${SPC}*if({SPC}|{CONT}) { - /* In order to catch nested $if, it is necessary to start from the beginning of - the line (otherwise we could catch something like "${var} if" */ +<THEN_BODY>^{SPC}*@#{SPC}*if({SPC}|{CONT}) { nested_if_nb++; then_body_tmp.append(yytext); yylloc->step(); } <THEN_BODY>. { then_body_tmp.append(yytext); yylloc->step(); } -<THEN_BODY><<EOF>> { driver.error(*yylloc, "Unexpected end of file: $if not matched by an $endif"); } -<THEN_BODY>^{SPC}*\${SPC}*else{SPC}*{EOL} { +<THEN_BODY><<EOF>> { driver.error(*yylloc, "Unexpected end of file: @#if not matched by an @#endif"); } +<THEN_BODY>^{SPC}*@#{SPC}*else{SPC}*{EOL} { yylloc->lines(1); yylloc->step(); if (nested_if_nb) @@ -230,13 +226,13 @@ CONT \\\\ } } -<THEN_BODY>^{SPC}*\${SPC}*endif{SPC}*{EOL} { +<THEN_BODY>^{SPC}*@#{SPC}*endif{SPC}*{EOL} { yylloc->lines(1); yylloc->step(); if (nested_if_nb) { - /* This $endif is not the end of the $if we're parsing, - but only that of a nested $if */ + /* This @#endif is not the end of the @#if we're parsing, + but only that of a nested @#if */ nested_if_nb--; then_body_tmp.append(yytext); } @@ -252,23 +248,21 @@ CONT \\\\ } <ELSE_BODY>{EOL} { yylloc->lines(1); yylloc->step(); else_body_tmp.append(yytext); } -<ELSE_BODY>^{SPC}*\${SPC}*if({SPC}|{CONT}) { - /* In order to catch nested $if, it is necessary to start from the beginning of - the line (otherwise we could catch something like "${var} if" */ +<ELSE_BODY>^{SPC}*@#{SPC}*if({SPC}|{CONT}) { nested_if_nb++; else_body_tmp.append(yytext); yylloc->step(); } <ELSE_BODY>. { else_body_tmp.append(yytext); yylloc->step(); } -<ELSE_BODY><<EOF>> { driver.error(*yylloc, "Unexpected end of file: $if not matched by an $endif"); } +<ELSE_BODY><<EOF>> { driver.error(*yylloc, "Unexpected end of file: @#if not matched by an @#endif"); } -<ELSE_BODY>^{SPC}*\${SPC}*endif{SPC}*{EOL} { +<ELSE_BODY>^{SPC}*@#{SPC}*endif{SPC}*{EOL} { yylloc->lines(1); yylloc->step(); if (nested_if_nb) { - /* This $endif is not the end of the $if we're parsing, - but only that of a nested $if */ + /* This @#endif is not the end of the @#if we're parsing, + but only that of a nested @#if */ nested_if_nb--; else_body_tmp.append(yytext); } @@ -318,7 +312,7 @@ MacroFlex::MacroFlex(istream* in, ostream* out) void MacroFlex::output_line(Macro::parser::location_type *yylloc) const { - *yyout << endl << "$line \"" << *yylloc->begin.filename << "\" " + *yyout << endl << "@#line \"" << *yylloc->begin.filename << "\" " << yylloc->begin.line << endl; } @@ -338,7 +332,7 @@ MacroFlex::restore_context(Macro::parser::location_type *yylloc) for_body_loc = context_stack.top().for_body_loc; // Remove top of stack context_stack.pop(); - // Dump $line instruction + // Dump @#line instruction output_line(yylloc); } @@ -357,7 +351,7 @@ MacroFlex::create_include_context(string *filename, Macro::parser::location_type yylloc->begin.column = yylloc->end.column = 0; // We are not in a loop body for_body.clear(); - // Output $line information + // Output @#line information output_line(yylloc); // Switch to new buffer yy_switch_to_buffer(yy_create_buffer(input, YY_BUF_SIZE)); -- GitLab