Я студент, и мне нужно написать синтаксический анализатор на C++ с помощью Boost-Library.
Поэтому я пишу грамматик в QI, потому что мне нужно разобрать структуру. Все идет нормально.
Я дам вам пример кода. Я думаю, что это проще, чем писать всю программу.
Описание: Итак, сначала мы берем txt-файл и читаем его, затем анализатор просматривает его и говорит: "Синтаксический анализ в порядке!" и разобрать в структуру. Наш вывод — это структура в консоли.
Это прекрасно работает, теперь несколько примеров кода. Здесь вы можете увидеть грамматику в Boost Spirit 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, точки и метка. Чтобы вы могли представить, что я имею в виду, вот TXT-файл, который мы пытаемся разобрать:
Subject: Physics
Dozent: Wayne
Datum: 20-10-2014
Anzahl: 20
729.888 33 5
185.363 35 5
Последние две строки - правило студента. А в txt-файле у нас больше этих двух строк.
Чтобы мы могли принять эти строки как «студент», мы написали вектор в нашей структуре с typedef:
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;
И есть, надеюсь, последняя проблема для нашего проекта...
Мы не знаем, какой тип данных нужен qi:rule, чтобы BOOST_ADAPT... работал с ним нормально. Все остальные точки являются строками, но я не знаю, как реализовать собственный вектор, который мы создали.
Все остальные правила работают нормально и находятся в структуре позже, только вектор создает проблемы.
У кого-нибудь есть идеи по этому поводу? Я могу загрузить больше файлов и фрагментов кода, если вам нужно, но я все еще думаю, что это может быть просто небольшая проблема, которую я не вижу. Я искал много тем для повышения, но не нашел нужной вещи.
Я должен добавить информацию, что я только начинающий, поэтому, возможно, я не все правильно объяснил и... да. Надеюсь, вы это понимаете. К тому же мой английский не самый лучший...
Спасибо заранее за вашу помощь.
Уильям
+student
. Заранее спасибо за помощь. - person William Wallace   schedule 01.05.2015