Hello,

I've been fiddling around with boost::spirit in an
attempt to write a small and esoteric scripting language.

Here's some code snipits of what I'm trying to do.
example script (a one liner in this case):

DO_SOMETHING(param1,param2)


the grammer:

struct my_grammer : public grammar<my_grammer>
{
        my_grammer(vector<string>& v_): v(v_) {}

    template <typename ScannerT>
    struct definition
    {
        definition(wb_grammer const& self)
        {
                        //char token defs
                        COMMA           = ch_p(',');
                        LPAREN  = ch_p('(');
                        RPAREN  = ch_p(')');
                        USCORE  = ch_p('_');

                        param_alnum             = lexeme_d[alpha_p >> *(alnum_p)];

                        do_something = str_p("DO_SOMETHING")                    >> 
LPAREN       >>
                                /*param1*/param_alnum[append(self.v)]           >> 
!COMMA       >>
                                /*param2*/param_alnum[append(self.v)]           >> 
RPAREN;

                        do_something_else = str_p("DO_SOMETHING_ELSE")          >> 
LPAREN       >>
                                /*param1*/param_mode[append(self.v)]            >> 
!COMMA       >>
                                /*param2*/param_type[append(self.v)]            >> 
RPAREN;

                        functions = do_something | do_something_else;
                }

        rule<ScannerT>
COMMA,LPAREN,RPAREN,USCORE,param_alnum,do_something,do_something_else,functi
ons;

        rule<ScannerT> const&
        start() const { return functions; }
    };

          vector<string>& v;
};


int main()
{
        vector<string> v;
        my_grammer script_grammer(v);
        string str;

        while (getline(cin, str))
        {
        parse_info<> info = parse(str.c_str(), script_grammer, space_p);

        if (info.full)
        {
                //determine which rule (script function) was called
                //and do something with the parameters stored in the vector
        }
          else
          {
                //error out.
          }
        }
}


problem:

My problem is how to determine which rule was the one
that resulted in a successful parsing of the
line ("DO_SOMETHING(param1,param2)");

NOTE: I'm unfortunately stuck with the MSVC 7.0 compiler so
I can't use the Tree functionalities of spirit because of their
implementations use of partial template specialization.

any ideas?

Thank you very much,

Chris.


_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to