Re: simple sql query parser
labsquare <[email protected]>
| Newsgroups | gmane.comp.parsers.spirit.general |
|---|---|
| Message-ID | <CABeqv=XD3hU1YiN4w-h9AvRR_gFJszL0rWOJhD8xcn8tShDzYQ@mail.gmail.com> |
I don't know how, I don't know why... But It works !!! Thank you very much !! 2017-12-31 2:31 GMT+01:00 Mike Gresens <[email protected]>: > Try this: > > // any character except "INSIDE" > auto condition = x3::rule<class condition, string>() > = x3::lexeme[*(x3::char_ - "INSIDE")]; > > Mike... > > Am 31.12.2017 um 01:49 schrieb labsquare: > > I'm trying to parse a simple pseudo-SQL like query using boost spirit x3. > But I didn't succes to extract the condition alone. It takes all the > string to the end ( with the INSIDE part). > Here is my attempt . Any suggestion ? > https://stackoverflow.com/questions/48033462/parse-sql- > like-query-with-boost-spirit-x3 > > // SELECT chr, pos FROM table// Select chr, pos FROM table WHERE a=5 and b = 6// SELECT chr, pos FROM table WHERE a =5 and b=6 INSIDE region > // I would like to extract :// vector<string> fields = {chr, pos}// string tablename = "table"// string where = "a=5 and b=6"// string region = "region" > > string source ="SELECT chr,pos FROM table WHERE a=5 AND b=6 INSIDE region"; > // varname = chr, pos, table, region > auto varname = x3::rule<class varname, string>() > = x3::lexeme[(x3::alpha >> *(x3::alnum|'_'|'.'))]; > // any character except "INSIDE" > auto condition = x3::rule<class condition, string>() > = x3::lexeme[*x3::char_]-"INSIDE"; > // fields selection > auto selectRule = x3::rule<class fields, vector<string>> () > = "SELECT" >> varname % ","; > > // table name > auto fromRule = x3::rule<class fromRule, string>() > = "FROM" >> varname; > // where clause > auto whereRule = x3::rule<class whereRule, vector<string>>() > = "WHERE" >> condition ; > // inside clause > auto insideRule = x3::rule<class insideRule, string>() > = "INSIDE" >> varname; > > auto begin = source.begin(); > auto end = source.end(); > > vector<string> results; > > x3::phrase_parse(begin,end, > selectRule >> fromRule >> -(whereRule >>-insideRule), > x3::space, results); > if (begin != end) > cout<<"COULD NOT PARSE"<<endl;else > cout<<"parse succes"<<endl; > for (auto i : results) > cout<<i<<endl; > > It returns: > > chr > postable > a=5 AND b=6 INSIDE region > > > > > > -- > -- > Dr Sacha Schutz > médecine / génétique moléculaire > Bioinformaticien > +33651571606 > dridk.me > www.labsquare.org > Fork me on github <https://github.com/> > > > > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > > > > _______________________________________________ > Spirit-general mailing [email protected]://lists.sourceforge.net/lists/listinfo/spirit-general > > > -- -- Dr Sacha Schutz médecine / génétique moléculaire Bioinformaticien +33651571606 dridk.me www.labsquare.org Fork me on github <https://github.com/> ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Spirit-general mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/spirit-general