Hi!
While playing around with the examples of the spirit library
I feel like I missed some essential points.
The far goal I have is to parse a file
containing C/C++ comments and
assignments of the form
name = value;
where I drop the comments and store the assignments
in a map.
If You have done something similar,
please share Your knowledge with the rest of us.
Below is a modifed version of comments.cpp.
Here I only try to output any comment found while dropping
the other stuff.
Why does the parser drop stuff after the 1st assignment?
the output of the code is
Parsed C-comment successfully!
Matched (27) characters: "//test2
/* test1 */// test
Any help appreciated.
Also I would like not to gather all commenst in one string ...
--------
#include "boost/spirit.hpp"
#include <iterator>
#include <string>
#include <iostream>
#include <cassert>
#include <fstream>
#include <map>
#include <cassert>
///////////////////////////////////////////////////////////////////////////////
// actor called after successfully matching a single character
class actor_string
{
public:
actor_string(std::string &rstr) :
matched(rstr)
{
}
void operator() (const char *pbegin, const char *pend) const
{
matched += std::string(pbegin, pend-pbegin);
}
private:
std::string &matched;
};
///////////////////////////////////////////////////////////////////////////////
// actor called after successfully matching a C++-comment
void actor_cpp (const char *pfirst, const char *plast)
{
std::cerr << "Parsing C++-comment" << std::endl;
std::cerr << "Matched (" << plast-pfirst << ") characters: ";
char cbbuffer[128];
strncpy(cbbuffer, pfirst, plast-pfirst);
cbbuffer[plast-pfirst] = '\0';
std::cerr << "\"" << cbbuffer << "\"" << std::endl;
}
///////////////////////////////////////////////////////////////////////////////
// main entry point
int main ()
{
using namespace boost::spirit;
/////////////////////////////////////////////////////////////////////////////
char const* pCComment = "//test2\n/* test1 */\n\n// test\nalpha =
3.0;\n\n// beta is soo important\nbeta=5.6;\n\n/* \n\nSometimes comments
are\ngood since\nbeta = 4.5;\nis a good choice, too\n\n*/";
typedef skipper_iteration_policy<> iter_policy_t;
typedef scanner_policies scanner_policies_t;
typedef scanner phrase_scanner_t;
rule cpp_comment, ignored, all;
cpp_comment =
comment_p("/*", "*/") // rule for C-comments
| comment_p("//") // rule for C++ comments
;
std::string comment_c;
all =
(
*cpp_comment[actor_string(comment_c)]
|
*anychar_p
)
;
ignored = (space_p | chlit<char>('\n'));
parse_info<> result;
result = parse (pCComment, all, space_p);
if (result.hit)
{
std::cerr << "Parsed C-comment successfully!" << std::endl;
std::cerr << "Matched (" << comment_c.size() << ") characters: ";
std::cerr << "\"" << comment_c << "\"" << std::endl;
}
else
{
std::cerr << "Failed to parse C/C++-comment!" << std::endl;
}
std::cerr << std::endl;
}
Markus
--
Compile time analytic differentiation?
Yes, at http://daixtrose.sourceforge.net/