Я студент, и мне нужно написать Parser на C++ с Boost-Library.Boost Spirit Parser с вектором трех строк, скомпилированных в структуру, не адаптируется к работе
Поэтому я пишу грамматик в QI, потому что мне нужно проанализировать структуру. Все идет нормально.
Я приведу вам примерный код. Я думаю, что это проще, чем записать всю программу.
Описание: Итак, сначала мы берем txt-файл и читаем его, а затем анализируем его, говорит: «Разбор в порядке!». и проанализируйте структуру. Наш вывод - это структура в консоли.
Это хорошо работает, теперь к некоторым примерам кода. Здесь вы можете увидеть грамматику в Boost Духа QI:
subject %= lexeme[lit("Fach: ") >> +(char_("a-zA-Z")) >> lit("\n")]; //works!
dozent %= lexeme[lit("Dozent: ") >> +(char_("a-zA-Z")) >> lit("\n")];
date %= lexeme[lit("Datum: ") >> digit >> digit >> lit("-") >> digit >> digit >> lit("-") >> digit >> digit >> digit >> digit >> lit("\n")];
count %= lexeme[lit("Anzahl: ") >> +digit >> lit("\n")];
points %= lexeme[+digit >> lit("\t")];
mark %= lexeme[digit >> lit("\n")];
matnumber %= lexeme[(digit >> digit >> digit >> punct >> digit >> digit >> digit) >> lit("\t")];
student %= matnumber >> points >> mark;
start %= subject >> dozent >> date >> count >> student;
Это прекрасно работает, правило для студентов приносит проблему, что у нас есть элемент с тремя частями. Matnumber, Points и mark. Что вы можете себе представить, что я имею в виду, здесь TXT-файл, который мы пытаемся разобрать:
Subject: Physics
Dozent: Wayne
Datum: 20-10-2014
Anzahl: 20
729.888 33 5
185.363 35 5
Последние две строки студент правило. И в txt-файле у нас больше этих двух строк.
То, что мы можем взять эти строки, как «студент» мы написали вектор в нашей структуре с ЬурейиМ:
typedef boost::fusion::vector<string, string, string> student_t;
, то мы будем использовать его в нашей структуре:
struct klausur
{
string str_subject;
string str_dozent;
string str_date;
string count;
string matr_nr;
string points;
string mark;
string ende;
student_t student;
void ToString()
{
cout << "Struct.Fach: " << str_subject << endl;
cout << "Struct.Dozent: " << str_dozent << endl;
cout << "Struct.Datum: " << str_date << endl;
cout << "Struct.Anzahl: " << count << endl;
cout << "Struct.Mat_Nr: " << matr_nr << endl;
cout << "Struct.Punkte: " << points << endl;
cout << "Struct.Note: " << mark << endl;
cout << "Struct.Student<0>: " << vec::at_c<0>(student);
cout << "Struct.Student<1>: " << vec::at_c<1>(student);
cout << "Struct.Student<2>: " << vec::at_c<2>(student);
}
};
Тогда мы имеем наш BOOST_ADAPT_STRUCT так:
BOOST_FUSION_ADAPT_STRUCT(
client::klausur,
(string, str_subject)
(string, str_dozent)
(string, str_date)
(string, count)
(string, matr_nr)
(string, points)
(string, mark)
(student_t, student)
)
Вы видите, что там есть typedef.
И тогда у нас есть наши правила в грамматике.
qi::rule<Iterator, string(), ascii::space_type> subject;
qi::rule<Iterator, string(), ascii::space_type> dozent;
qi::rule<Iterator, string(), ascii::space_type> date;
qi::rule<Iterator, string(), ascii::space_type> count;
qi::rule<Iterator, string(), ascii::space_type> matnumber;
qi::rule<Iterator, string(), ascii::space_type> points;
qi::rule<Iterator, string(), ascii::space_type> mark;
qi::rule<Iterator, boost::fusion::vector<boost::fusion::vector<std::string, std::string, std::string> >()> student;
И есть, надеюсь, последняя проблема для нашего проекта ...
Мы не знаем, который DATATYPE й: правила необходимо, чтобы BOOST_ADAPT ... отлично работает с ним. Все остальные точки являются строками, но не знают, как реализовать собственный вектор, который мы создали.
Все остальные правила работают нормально и находятся в структуре позже, так как только вектор создает проблемы.
Есть ли у кого-то представление об этом? Я могу загрузить больше файлов и фрагментов кода, если вам нужно, но я все же думаю, что это может быть небольшая проблема, которую я не вижу. Я оглядываюсь на многие темы повышения, но не нашел правильной вещи.
Я должен добавить информацию о том, что я просто начинающий, поэтому, возможно, я не все объяснил правильно и ... да. Надеюсь, вы это понимаете. Также мой английский не лучший ...
Заранее благодарю вас за помощь.
William
Почему нет шкипер на последнем правиле? Какие ошибки вы получаете? Вы пробовали правило? Вы уверены, что student_t не находится в клиенте пространства имен? У вас проблемы с разбором нескольких учеников? В вашем стартовом правиле содержится только один студент. Попробуйте клиенскую звезду. –
FRob
Эй, был шкипер, но для тестирования я его удалил. Я всегда получаю ошибку, что он не может разрешить оператор в более глубокой библиотечной функции. Я уверен, что student_t находится в клиенте пространства имен, это проблема? На данный момент для тестирования был только один студент. Обычно правило было бы ... '+ student'. Заранее благодарю вас за помощь. –