I've having a hard time getting my parser to work correctly.  I'm trying to create a script parser to create tests, actions, and groups defined in a file.  I have the grammer working except for one small issue.  I can't get rid of the closing quote on my sentence.  It skips the first one just fine.  I'm using spirit 1.6.2
 
The script is below named script.txt:
----------------------
Groups
{G100, "This is group G100",
G200, "This is group G200"
}
 
Actions
{A100, "This is an action"
}
 
Tests
{T100, "This is a test", 0, 5, "VDC"
}
 
TestFlow
{a
}
----------------------------------
I want to have the option of using double quotes (") around strings for the discriptions in Groups, Actions, and Tests section to make it easier to read.  I use comma as a delimiter.
 
Here is my spirit code below:
----------------------------------
#include <iostream>
#include <fstream>
#include <vector>
 
#if defined(_DEBUG)
//#define BOOST_SPIRIT_DEBUG
#endif // defined(_DEBUG)
 
#include "boost/spirit.hpp"
#include <boost/spirit/core.hpp>
#include <boost/spirit/utility.hpp>
#include <boost/spirit/symbols.hpp>
 
///////////////////////////////////////////////////////////////////////////////
// used namespaces
using namespace boost::spirit;
using namespace std;
 
namespace
{
   void
   my_action(char const* first, char const* last)
   {
      std::string str(first, last);
      std::cout << str << std::endl;
   }
 
   void
   my_number(float val)
   {
      std::cout << val << std::endl;
   }
 
}
 

struct script_grammar : public grammar<script_grammar>
{
   template <typename ScannerT>
   struct definition
   {
      definition(script_grammar const& self)
      {
 
         Group_Composite       = Group >>
                                 BeginBrace >>
                                 +Group_Action_Parms >>
                                 EndBrace;
 
         Action_Composite      = Action >>
                                 BeginBrace >>
                                 +Group_Action_Parms >>
                                 EndBrace;
 
         Test_Composite        = Test >>
                                 BeginBrace >>
                                 +Test_Parms >>
                                 EndBrace;
 
         TestFlow_Composite    = TestFlow >>
                                 BeginBrace >>
                                 +TestFlow_Parms >>
                                 EndBrace;
       
         Group                 = as_lower_d[str_p("groups")];
         Group_Action_Parms    = Token[&my_action] >>
                                 Comma >>
                                 Token[&my_action] >>
                                 !Comma;
 
         Action                = as_lower_d[str_p("actions")];
 
         Test                  = as_lower_d[str_p("tests")];
         Test_Parms            = Token[&my_action] >>
                                 Comma >>
                                 Token[&my_action] >>
                                 Comma >>
                                 real_p[&my_number] >>
                                 Comma >>
                                 real_p[&my_number] >>
                                 Comma >>
                                 Token[&my_action] >>
                                 !Comma;
 
         TestFlow              = as_lower_d[str_p("testflow")];
         TestFlow_Parms        = Token;
        
         BeginBrace            = ch_p('{');
         EndBrace              = ch_p('}');
         Comma                 = ch_p(',');
         Token                 = +Token_Sub;
         Token_Sub             = alnum_p; //(alnum_p - ch_p(34)); // ^ ch_p('\"'));
        
         first  = *(
                  Group_Composite |
                  Action_Composite |
                  Test_Composite ) >>
                  TestFlow_Composite;
 
         BOOST_SPIRIT_DEBUG_RULE(Group_Composite);
         BOOST_SPIRIT_DEBUG_RULE(Action_Composite);
         BOOST_SPIRIT_DEBUG_RULE(Test_Composite);
         BOOST_SPIRIT_DEBUG_RULE(TestFlow_Composite);
         BOOST_SPIRIT_DEBUG_RULE(Group);
         BOOST_SPIRIT_DEBUG_RULE(Group_Action_Parms);
         BOOST_SPIRIT_DEBUG_RULE(Action);
         BOOST_SPIRIT_DEBUG_RULE(Test);
         BOOST_SPIRIT_DEBUG_RULE(Test_Parms);
         BOOST_SPIRIT_DEBUG_RULE(TestFlow);
         BOOST_SPIRIT_DEBUG_RULE(TestFlow_Parms);
         BOOST_SPIRIT_DEBUG_RULE(BeginBrace);
         BOOST_SPIRIT_DEBUG_RULE(EndBrace);
         BOOST_SPIRIT_DEBUG_RULE(Comma);
         BOOST_SPIRIT_DEBUG_RULE(Token);
         BOOST_SPIRIT_DEBUG_RULE(first);
         BOOST_SPIRIT_DEBUG_RULE(Token_Sub);
     
      }
 
      rule<ScannerT> Group_Composite,
                     Action_Composite,
                     Test_Composite,
                     TestFlow_Composite,
                     Group,
                     Group_Action_Parms,
                     Action,
                     Test,
                     Test_Parms,
                     TestFlow,
                     TestFlow_Parms,
                     BeginBrace,
                     EndBrace,
                     Comma,
                     Token,
                     Token_Sub;
 
      rule<ScannerT> first;
      rule<ScannerT> const&
      start() const { return first; }
   };
};
 
struct skip_grammar : public grammar<skip_grammar>
{
    template <typename ScannerT>
    struct definition
    {
        definition(skip_grammar const& /*self*/)
        {
            skip
                =   space_p
                |   ch_p('\"')
                ;
 
            BOOST_SPIRIT_DEBUG_RULE(skip);
        }
 
        rule<ScannerT> skip;
 
        rule<ScannerT> const&
        start() const { return skip; }
    };
};
 
template<typename GrammarT>
void
parse(GrammarT const& g, char const* filename)
{
    ifstream in(filename);
 
    if (!in)
    {
        cerr << "Could not open input file: " << filename << endl;
        return;
    }
 
    in.unsetf(ios::skipws); //  Turn off white space skipping on the stream
 
    vector<char> vec;
    std::copy(
        istream_iterator<char>(in),
        istream_iterator<char>(),
        std::back_inserter(vec));
 
    vector<char>::const_iterator start = vec.begin();
    vector<char>::const_iterator end = vec.end();
 
    skip_grammar skip;
 
    parse_info<vector<char>::const_iterator> result =
        parse(start, end, g, skip);
 
    if (result.full)
        cerr << filename << " Parses OK" << endl;
    else {
        cerr << filename << " Fails Parsing" << endl;
        for (int i = 0; i < 50; i++)
        {
            if (result.stop == end)
                break;
            cerr << *result.stop++;
        }
        cerr << endl;
    }
 
}
 
// main entrypoint
int
main(int argc, char* argv[])
{
   // Start grammar definition
   cerr << "Start of Parsing ..." << endl;
 
   // main driver code
   script_grammar g;
 
   if (2 == argc)
      parse(g, argv[1]);
   else
      cerr << "No filename given" << endl;
 
   return 0;
}
 
The output looks like this:
Start of Parsing ...
G100
This is group G100"
G200
This is group G200"
 
A100
This is an action"
 
T100
This is a test"
0
5
VDC"
 
c:\script.txt Parses OK
 
I'm trying to get rid of the quote on the end.  Please help.
 
Thanks,
Brad
 
Brad Retzlaff
Design Engineer
Functional Test Development

Plexus Technology Group

55 Jewelers Park Dr.
PO Box
677
Neenah, WI 54957
Phone: (920) 720-6733
Fax: (920) 751-5366
http://www.plexus.com