18 #include <boost/filesystem.hpp> 19 #include <boost/format.hpp> 33 namespace classic = boost::spirit::classic;
34 namespace bf = boost::filesystem;
44 while ( !ifs.
eof() ) {
51 ifs.
seekg( 0, ifs.beg );
54 template <
typename Grammar>
57 int last_line, last_column;
59 GetLastLineAndColumn( stream, last_line, last_column );
65 ForwardIterator fwd_begin = boost::spirit::make_default_multi_pass( in_begin );
70 Iterator position_begin( fwd_begin, fwd_end, stream_name );
74 gp::SkipperGrammar<Iterator> skipper;
76 root->value = stream_name;
77 bool result = qi::phrase_parse( position_begin, position_end,
gr, skipper, *
root );
80 if ( result && ( pos.line == last_line ) && ( pos.column == last_column ) ) {
return true; }
82 messages->AddError( gp::Position( stream_name, pos.line, pos.column ),
"parse error" );
87 template <
typename Grammar>
89 gp::IncludedFiles* included, gp::Messages* messages, gp::Node*
root ) {
91 if ( !from.filename().empty() ) {
92 bf::path file_path( from.filename() );
93 search_path_with_current_dir =
94 file_path.parent_path().
string() +
95 ( search_path_with_current_dir.empty() ?
"" : (
"," + search_path_with_current_dir ) );
100 if ( absolute_path.
empty() ) {
101 messages->AddError( from,
"Couldn't find a file " +
filename +
" in search path '" +
102 search_path_with_current_dir +
"'" );
105 const gp::Position* included_from;
106 if ( !included->GetPosition( absolute_path, &included_from ) ) {
107 included->AddFile( absolute_path, from );
109 if ( !file.is_open() ) {
110 messages->AddError( from,
"Couldn't open a file " +
filename );
113 return ParseStream<Grammar>( file, absolute_path, messages,
root );
115 assert( included_from != NULL );
116 messages->AddWarning( from, str(
boost::format(
"File %1% already included from %2%" ) % absolute_path %
117 included_from->ToString() ) );
132 return ParseFile<Grammar>( from,
filename, search_path, included, messages,
root );
139 return ParseFile<Grammar>( from,
filename, search_path, included, messages,
root );
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
bool ParseUnits(const Position &from, const std::string &filename, const std::string &search_path, IncludedFiles *included, Messages *messages, Node *root)
static std::string find_file_from_list(const std::string &logical_file_name, const std::string &search_list, SearchType search_type=LocalSearch)
std::string::const_iterator BaseIterator
std::string replaceEnvironments(const std::string &input)
boost::spirit::multi_pass< BaseIterator > ForwardIterator
bool Parse(const std::string &filename, const std::string &search_path, IncludedFiles *included, Messages *messages, Node *root)
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
boost::spirit::classic::file_position_base< std::string > IteratorPosition