![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
The Static Lexer ModelBoost , Spirit 2.5.2 , Abstracts
|
![]() | Note |
---|---|
Сгенерированный код будет компилироваться в номере версии текущей библиотекиSpirit.Lex. Этот номер версии используется во время компиляции вашего объекта статического лексера, чтобы убедиться, что он составлен с использованием точно такой же версии.Spirit.Lexбиблиотека как лексер таблицы были созданы с. Если они не совпадают, вы увидите ошибку компиляции, в которой упоминается< |
Второй необходимый шаг для преобразования существующего динамического лексера в статический — это изменение основной программы в двух местах. Во-первых, вам нужно изменить тип используемого лексера (это параметр шаблона, используемый при создании класса определения токена). Хотя в динамической модели мы использовали шаблон<lex::lexertl::lexer<>
>, теперь нам нужно изменить его на тип<lex::lexertl::static_lexer<>
>. Второе изменение тесно связано с первым и предполагает исправление соответствующего<#include
>утверждения:
#include <boost/spirit/include/lex_static_lexertl.hpp>
В противном случае основная программа не отличается от эквивалентной программы, использующей динамическую модель. Эта функция облегчает разработку лексера в динамическом режиме и переключение на статический режим после стабилизации кода. Простое приложение генератора, представленное выше, позволяет интегрировать генератор кода в любой существующий процесс сборки. Следующий фрагмент кода обеспечивает общую основную функцию, выделяя изменяемый код.
int main(int argc, char* argv[]) { // Define the token type to be used: 'std::string' is available as the type // of the token value. typedef lex::lexertl::token< char const*, boost::mpl::vector<std::string> > token_type; // Define the lexer type to be used as the base class for our token // definition. // // This is the only place where the code is different from an equivalent // dynamic lexical analyzer. We use the `lexertl::static_lexer<>` instead of // the `lexertl::lexer<>` as the base class for our token defintion type. // // As we specified the suffix "wc" while generating the static tables we // need to pass the type lexertl::static_::lexer_wc as the second template // parameter below (see word_count_generate.cpp). typedef lex::lexertl::static_lexer< token_type, lex::lexertl::static_::lexer_wc > lexer_type; // Define the iterator type exposed by the lexer. typedef word_count_tokens<lexer_type>::iterator_type iterator_type; // Now we use the types defined above to create the lexer and grammar // object instances needed to invoke the parsing process. word_count_tokens<lexer_type> word_count; // Our lexer word_count_grammar<iterator_type> g (word_count); // Our parser // Read in the file into memory. std::string str (read_from_file(1 == argc ? "word_count.input" : argv[1])); char const* first = str.c_str(); char const* last = &first[str.size()]; // Parsing is done based on the token stream, not the character stream. bool r = lex::tokenize_and_parse(first, last, word_count, g); if (r) { // success std::cout << "lines: " << g.l << ", words: " << g.w << ", characters: " << g.c << "\n"; } else { std::string rest(first, last); std::cerr << "Parsing failed\n" << "stopped at: \"" << rest << "\"\n"; } return 0; }
![]() | Important |
---|---|
Созданный код для статического лексера содержит идентификаторы токенов, как они были назначены, либо явно программистом, либо неявно во время построения лексера. Вы несете ответственность за то, чтобы все экземпляры определенного типа статического лексера использовали одинаковые идентификаторы токенов. Конструктор объекта лексера имеет второй (по умолчанию) параметр, позволяющий ему обозначить идентификатор стартового токена, который будет использоваться при назначении идентификаторов определениям токена. Вышеприведенное требование выполняется по умолчанию до тех пор, пока во время построения статических лексеров не указано< |
Статья The Static Lexer Model раздела Spirit 2.5.2 Abstracts может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |