preprocessor: macroprocessor: add @#includepath macro. #1039
parent
d8eff0843f
commit
2518f6c83c
|
@ -845,12 +845,14 @@ information about the configuration file.
|
||||||
Defines a macro-variable from the command line (the same effect as using
|
Defines a macro-variable from the command line (the same effect as using
|
||||||
the Macro directive @code{@@#define} in a model file, @pxref{Macro-processing language}).
|
the Macro directive @code{@@#define} in a model file, @pxref{Macro-processing language}).
|
||||||
|
|
||||||
|
@anchor{-I}
|
||||||
@item -I@var{<<path>>}
|
@item -I@var{<<path>>}
|
||||||
Defines a path to search for files to be included by the
|
Defines a path to search for files to be included by the
|
||||||
macroprocessor (using the @ref{@@#include} command). Multiple
|
macroprocessor (using the @ref{@@#include} command). Multiple
|
||||||
@code{-I} flags can be passed on the command line. The paths will be
|
@code{-I} flags can be passed on the command line. The paths will be
|
||||||
searched in the order that the @code{-I} flags are passed and the
|
searched in the order that the @code{-I} flags are passed and the
|
||||||
first matching file will be used.
|
first matching file will be used. The flags passed here take priority
|
||||||
|
over those passed to @ref{@@#includepath}.
|
||||||
|
|
||||||
@item nostrict
|
@item nostrict
|
||||||
Allows Dynare to issue a warning and continue processing when
|
Allows Dynare to issue a warning and continue processing when
|
||||||
|
@ -8832,6 +8834,8 @@ of the line indicates that the directive is continued on the next
|
||||||
line. The main directives are:
|
line. The main directives are:
|
||||||
@itemize
|
@itemize
|
||||||
@item
|
@item
|
||||||
|
@code{@@#includepath}, paths to search for files that are to be included,
|
||||||
|
@item
|
||||||
@code{@@#include}, for file inclusion,
|
@code{@@#include}, for file inclusion,
|
||||||
@item
|
@item
|
||||||
@code{@@#define}, for defining a macro-processor variable,
|
@code{@@#define}, for defining a macro-processor variable,
|
||||||
|
@ -8937,13 +8941,34 @@ constructed as explained above.
|
||||||
@node Macro directives
|
@node Macro directives
|
||||||
@subsection Macro directives
|
@subsection Macro directives
|
||||||
|
|
||||||
|
@anchor{@@#includepath}
|
||||||
|
@deffn {Macro directive} @@#includepath "@var{PATH}"
|
||||||
|
@deffnx {Macro directive} @@#includepath @var{MACRO_VARIABLE}
|
||||||
|
This directive adds the colon-separated paths contained in @var{PATH}
|
||||||
|
to the list of those to search when looking for a @code{.mod} file
|
||||||
|
specified by @ref{@@#include}. Note that these paths are added
|
||||||
|
@i{after} any paths passed using @ref{-I}.
|
||||||
|
|
||||||
|
@examplehead
|
||||||
|
|
||||||
|
@example
|
||||||
|
@@#include "/path/to/folder/containing/modfiles:/path/to/another/folder"
|
||||||
|
@@#include folders_containing_mod_files
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@anchor{@@#include}
|
@anchor{@@#include}
|
||||||
@deffn {Macro directive} @@#include "@var{FILENAME}"
|
@deffn {Macro directive} @@#include "@var{FILENAME}"
|
||||||
@deffnx {Macro directive} @@#include @var{MACRO_VARIABLE}
|
@deffnx {Macro directive} @@#include @var{MACRO_VARIABLE}
|
||||||
This directive simply includes the content of another file at the
|
This directive simply includes the content of another file at the
|
||||||
place where it is inserted. It is exactly equivalent to a copy/paste
|
place where it is inserted. It is exactly equivalent to a copy/paste
|
||||||
of the content of the included file. Note that it is possible to nest
|
of the content of the included file. Note that it is possible to nest
|
||||||
includes (@i{i.e.} to include a file from an included file).
|
includes (@i{i.e.} to include a file from an included file). The file
|
||||||
|
will be searched for in the current directory. If it is not found, the
|
||||||
|
file will be searched for in the folders provided by @ref{-I} and
|
||||||
|
@ref{@@#includepath}.
|
||||||
|
|
||||||
@examplehead
|
@examplehead
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ private:
|
||||||
//! Should we omit the @#line statements ?
|
//! Should we omit the @#line statements ?
|
||||||
const bool no_line_macro;
|
const bool no_line_macro;
|
||||||
//! The paths to search when looking for .mod files
|
//! The paths to search when looking for .mod files
|
||||||
const vector<string> path;
|
vector<string> path;
|
||||||
//! True iff current context is the body of a loop
|
//! True iff current context is the body of a loop
|
||||||
bool is_for_context;
|
bool is_for_context;
|
||||||
//! If current context is the body of a loop, contains the string of the loop body
|
//! If current context is the body of a loop, contains the string of the loop body
|
||||||
|
@ -122,6 +122,10 @@ private:
|
||||||
//! Restore last scanning context
|
//! Restore last scanning context
|
||||||
void restore_context(Macro::parser::location_type *yylloc);
|
void restore_context(Macro::parser::location_type *yylloc);
|
||||||
|
|
||||||
|
//! pushes the colon-separated paths passed to @#includepath onto the path vector
|
||||||
|
void push_path(string *includepath, Macro::parser::location_type *yylloc,
|
||||||
|
MacroDriver &driver);
|
||||||
|
|
||||||
//! Saves current scanning context and create a new context with content of filename
|
//! Saves current scanning context and create a new context with content of filename
|
||||||
/*! Filename must be a newly allocated string which will be deleted by the lexer */
|
/*! Filename must be a newly allocated string which will be deleted by the lexer */
|
||||||
void create_include_context(string *filename, Macro::parser::location_type *yylloc,
|
void create_include_context(string *filename, Macro::parser::location_type *yylloc,
|
||||||
|
@ -178,7 +182,7 @@ public:
|
||||||
//! Starts parsing a file, returns output in out
|
//! Starts parsing a file, returns output in out
|
||||||
/*! \param no_line_macro should we omit the @#line statements ? */
|
/*! \param no_line_macro should we omit the @#line statements ? */
|
||||||
void parse(const string &f, ostream &out, bool debug, bool no_line_macro,
|
void parse(const string &f, ostream &out, bool debug, bool no_line_macro,
|
||||||
map<string,string> defines, const vector<string> path);
|
map<string,string> defines, vector<string> path);
|
||||||
|
|
||||||
//! Name of main file being parsed
|
//! Name of main file being parsed
|
||||||
string file;
|
string file;
|
||||||
|
|
|
@ -21,6 +21,9 @@
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <boost/algorithm/string/trim.hpp>
|
||||||
|
#include <boost/algorithm/string/split.hpp>
|
||||||
|
#include <boost/tokenizer.hpp>
|
||||||
|
|
||||||
#include "MacroDriver.hh"
|
#include "MacroDriver.hh"
|
||||||
|
|
||||||
|
@ -68,6 +71,47 @@ CONT \\\\
|
||||||
yylloc->step();
|
yylloc->step();
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
<INITIAL>^{SPC}*@#{SPC}*includepath{SPC}+\"([^\"\r\n:;|<>]*){1}(:[^\"\r\n:;|<>]*)*\"{SPC}*{EOL} {
|
||||||
|
yylloc->lines(1);
|
||||||
|
yylloc->step();
|
||||||
|
|
||||||
|
// Get path
|
||||||
|
string *includepath = new string(yytext);
|
||||||
|
int dblq_idx1 = includepath->find('"');
|
||||||
|
int dblq_idx2 = includepath->find('"', dblq_idx1 + 1);
|
||||||
|
includepath->erase(dblq_idx2);
|
||||||
|
includepath->erase(0, dblq_idx1 + 1);
|
||||||
|
|
||||||
|
push_path(includepath, yylloc, driver);
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
<INITIAL>^{SPC}*@#{SPC}*includepath{SPC}+[^\"\r\n]*{SPC}*{EOL} {
|
||||||
|
yylloc->lines(1);
|
||||||
|
yylloc->step();
|
||||||
|
|
||||||
|
// Get variable name
|
||||||
|
string pathvar = string(yytext);
|
||||||
|
int dblq_idx1 = pathvar.find("includepath");
|
||||||
|
pathvar.erase(0, dblq_idx1 + 11);
|
||||||
|
pathvar.erase(0, pathvar.find_first_not_of(" \t"));
|
||||||
|
size_t p = pathvar.find_last_not_of(" \t\n\r");
|
||||||
|
if (string::npos != p)
|
||||||
|
pathvar.erase(p+1);
|
||||||
|
|
||||||
|
string *includepath = NULL;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
includepath = new string(driver.get_variable(pathvar)->toString());
|
||||||
|
}
|
||||||
|
catch(MacroDriver::UnknownVariable(&e))
|
||||||
|
{
|
||||||
|
driver.error(*yylloc, "Unknown variable: " + pathvar);
|
||||||
|
}
|
||||||
|
push_path(includepath, yylloc, driver);
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
|
||||||
<INITIAL>^{SPC}*@#{SPC}*include{SPC}+\"[^\"\r\n]*\"{SPC}*{EOL} {
|
<INITIAL>^{SPC}*@#{SPC}*include{SPC}+\"[^\"\r\n]*\"{SPC}*{EOL} {
|
||||||
yylloc->lines(1);
|
yylloc->lines(1);
|
||||||
yylloc->step();
|
yylloc->step();
|
||||||
|
@ -383,6 +427,22 @@ MacroFlex::restore_context(Macro::parser::location_type *yylloc)
|
||||||
output_line(yylloc);
|
output_line(yylloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MacroFlex::push_path(string *includepath, Macro::parser::location_type *yylloc,
|
||||||
|
MacroDriver &driver)
|
||||||
|
{
|
||||||
|
using namespace boost;
|
||||||
|
vector<string> tokenizedPath;
|
||||||
|
split(tokenizedPath, *includepath, is_any_of(":"), token_compress_on);
|
||||||
|
for (vector<string>::iterator it = tokenizedPath.begin();
|
||||||
|
it != tokenizedPath.end(); it++ )
|
||||||
|
if (!it->empty())
|
||||||
|
{
|
||||||
|
trim(*it);
|
||||||
|
path.push_back(*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MacroFlex::create_include_context(string *filename, Macro::parser::location_type *yylloc,
|
MacroFlex::create_include_context(string *filename, Macro::parser::location_type *yylloc,
|
||||||
MacroDriver &driver)
|
MacroDriver &driver)
|
||||||
|
|
Loading…
Reference in New Issue