Я новичок в Boost :: spirit, и я хочу определить грамматику, которая анализирует язык TTCN. (http://www.trex.informatik.uni-goettingen.de/trac/wiki/ttcn-3_4.5.1)) Я пытаюсь определить некоторые правила для парсеров «primitve», таких как Alpha, AlphaNum, чтобы быть достоверными с 1 по 1 в оригинальной грамматике, но, очевидно, я делаю что-то неправильно, потому что грамматика, определенная таким образом, не работает. Но когда я использую примитивные синтаксические анализаторы вместо TTCN, он начал работать.Boost :: spirit (classic) примитивы против пользовательских парсеров
Может кто-нибудь сказать, почему «вручную» определенные правила не работают должным образом? Как это исправить, потому что я хотел бы придерживаться оригинальной грамматики. Это ошибка кода begginer или что-то другое?
#define BOOST_SPIRIT_DEBUG
#include <boost/spirit/include/classic_symbols.hpp>
#include <boost/spirit/include/classic_tree_to_xml.hpp>
#include <boost/spirit/include/classic_position_iterator.hpp>
#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_parse_tree.hpp>
#include <boost/spirit/include/classic_ast.hpp>
#include <iostream>
#include <string>
#include <boost/spirit/home/classic/debug.hpp>
using namespace boost::spirit::classic;
using namespace std;
using namespace BOOST_SPIRIT_CLASSIC_NS;
typedef node_iter_data_factory<int> factory_t;
typedef position_iterator<std::string::iterator> pos_iterator_t;
typedef tree_match<pos_iterator_t, factory_t> parse_tree_match_t;
typedef parse_tree_match_t::const_tree_iterator iter_t;
struct ParseGrammar: public grammar<ParseGrammar>
{
template<typename ScannerT>
struct definition
{
definition(ParseGrammar const &)
{
KeywordImport = str_p("import");
KeywordAll = str_p("all");
SemiColon = ch_p(';');
Underscore = ch_p('_');
NonZeroNum = range_p('1','9');
Num = ch_p('0') | NonZeroNum;
UpperAlpha = range_p('A', 'Z');
LowerAlpha = range_p('a', 'z');
Alpha = UpperAlpha | LowerAlpha;
AlphaNum = Alpha | Num;
//this does not!
Identifier = lexeme_d[Alpha >> *(AlphaNum | Underscore)];
// Uncomment below line to make rule work
// Identifier = lexeme_d[alpha_p >> *(alnum_p | Underscore)];
Module = KeywordImport >> Identifier >> KeywordAll >> SemiColon;
BOOST_SPIRIT_DEBUG_NODE(Module);
BOOST_SPIRIT_DEBUG_NODE(KeywordImport);
BOOST_SPIRIT_DEBUG_NODE(KeywordAll);
BOOST_SPIRIT_DEBUG_NODE(Identifier);
BOOST_SPIRIT_DEBUG_NODE(SemiColon);
}
rule<ScannerT> KeywordImport,KeywordAll,Module,Identifier,SemiColon;
rule<ScannerT> Alpha,UpperAlpha,LowerAlpha,Underscore,Num,AlphaNum;
rule<ScannerT> NonZeroNum;
rule<ScannerT> const&
start() const { return Module; }
};
};
int main()
{
ParseGrammar resolver; // Our parser
BOOST_SPIRIT_DEBUG_NODE(resolver);
string content = "import foobar all;";
pos_iterator_t pos_begin(content.begin(), content.end());
pos_iterator_t pos_end;
tree_parse_info<pos_iterator_t, factory_t> info;
info = ast_parse<factory_t>(pos_begin, pos_end, resolver, space_p);
std::cout << "\ninfo.length : " << info.length << std::endl;
std::cout << "info.full : " << info.full << std::endl;
if(info.full)
{
std::cout << "OK: Parsing succeeded\n\n";
}
else
{
int line = info.stop.get_position().line;
int column = info.stop.get_position().column;
std::cout << "-------------------------\n";
std::cout << "ERROR: Parsing failed\n";
std::cout << "stopped at: " << line << ":" << column << "\n";
std::cout << "-------------------------\n";
}
return 0;
}
sehe, thans много! Вы мне очень помогли. Я попытался заглянуть в дух V2, но похоже, что документация не так понятна по некоторым вопросам, как для boost :: classic. Благодаря вашему коду мне удалось понять несколько концепций, которые меня блокировали. Еще раз спасибо! – Gregory81
@ Gregory81 Cheers! Подсказка: никогда не стесняйтесь объяснять, чего вы действительно пытаетесь достичь. Я всегда так рассуждаю: если вы собираетесь попросить других рассказать об этом, вы можете попросить их о лучшем способе, о котором они могут думать, вместо того, чтобы просто указать одну деталь, на которую вы застряли. См. Также [XY-problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – sehe
Также, теперь, когда ваша перспектива на Spirit V2 немного изменилась, не стесняйтесь спрашивать больше вопросов об этом (или просто просмотрите [tag: boost-spirit] или [tag: boost-spirit-qi], поскольку много информации уже есть. – sehe