Skip to content

Releases: thewizardplusplus/wizard-parser

v4.4

26 Jun 01:32
Compare
Choose a tag to compare

Small refactoring of the general code and significantly reducing and simplifying of the example.

Change Log

  • Rename types:
    • lexer::exception_group:
      • rename it to type_group;
      • update the example;
    • parser::optional_offset:
      • rename it to offset_optional.
  • In the parser module:
    • Add the list parser:
      • implement it;
      • cover it with tests;
      • use it in the example.
    • Remove the empty_parser class:
      • remove it;
      • remove its tests.
    • Unifying header for all parsers:
      • implement it;
      • use it in the example.
    • In the tests:
      • Improve tests:
        • of the repetition_parser class;
        • of the parse() function;
        • of the parse_all() function.
      • Refactor tests:
        • of the repetition_parser class;
        • of the parse_all() function.
  • In the transformers module:
    • Add the default_ast_node_handlers constant:
      • implement it;
      • use it:
        • in the parser::parse() function;
        • in the parser::parse_all() function.
    • Add the transform() function for few handlers:
      • implement it;
      • cover it with tests;
      • use it in the parser::parse() function.
  • In the example:
    • Refactor:
      • reduce a list of included headers;
      • remove types:
        • constant_group;
        • function_group;
      • lexemes:
        • fix a code style;
      • built-in functions:
        • use the std::fmod() function for computing a division remainder;
        • fix a code style;
        • fix the explanatory comment;
      • evaluate_ast_node() function:
        • make some functions local for it:
          • inspect_sequence() function;
        • fix a code style;
      • main() function:
        • make some functions local for it:
          • stop() function;
          • enrich_exception() function;
        • fix a code style.
    • Extend tests of errors:
      • check unexpected entities:
        • constants;
        • functions;
      • split tests to short and verbose:
        • mark existing tests as a short version;
        • add a verbose version of tests.

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
    • возможность исключения токенов из результирующего списка;
  • парсинг ASCII-текста:
    • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • результат:
    • представление в виде:
      • CST;
      • AST;
    • задание имени ноды в дереве;
  • парсеры:
    • терминальные:
      • определённые:
        • текст;
        • лексема;
    • комбинаторы:
      • альтернатива (упорядоченная);
      • объединяющие:
        • следование;
        • повторение:
          • 0 или 1 раз (опциональность);
          • 0 или больше раз;
          • 1 или больше раз;
          • любое число раз в указанном диапазоне;
        • список с разделителем;
      • проверяющие:
        • исключение;
        • просмотр вперёд:
          • позитивный;
          • негативный.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v4.3

15 Jun 15:13
Compare
Choose a tag to compare

Improve error handling in the parser module.

Change Log

  • In the parser module:
    • Fix default values in a constructor of the repetition_parser class.
    • Fix error handling:
      • in the alternation_parser::parse() method;
      • in the exception_parser::parse() method;
      • in the lookahead_parser::parse() method;
      • in the repetition_parser::parse() method.
    • Refactor:
      • concatenation_parser::parse() method;
      • match_parser::parse() method;
      • typing_parser::parse() method.
    • In the tests:
      • Upgrade tests:
        • of the alternation_parser class;
        • of the exception_parser class;
        • of the lookahead_parser class;
        • of the repetition_parser class.
      • Improve tests:
        • of the alternation_parser class;
        • of the concatenation_parser class;
        • of the dummy_parser class;
        • of the exception_parser class;
        • of the lookahead_parser class;
        • of the repetition_parser class;
        • of the typing_parser class.
      • Complete checking of methods calls:
        • in classes:
          • alternation_parser;
          • concatenation_parser;
          • dummy_parser;
          • exception_parser;
          • lookahead_parser;
          • repetition_parser;
          • typing_parser;
        • in functions:
          • parse_all();
          • parse().
  • In the example:
    • Enrich positional exceptions:
      • mark an unexpected entity:
        • position of it;
        • length of it;
      • add the verbose option:
        • parse it;
        • use it.
    • Extend tests of errors in the example.

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
    • возможность исключения токенов из результирующего списка;
  • парсинг ASCII-текста:
    • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • результат:
    • представление в виде:
      • CST;
      • AST;
    • задание имени ноды в дереве;
  • парсеры:
    • терминальные:
      • пустота;
      • определённые:
        • текст;
        • лексема;
    • комбинаторы:
      • альтернатива (упорядоченная);
      • объединяющие:
        • следование;
        • повторение:
          • 0 или 1 раз (опциональность);
          • 0 или больше раз;
          • 1 или больше раз;
          • любое число раз в указанном диапазоне;
      • проверяющие:
        • исключение;
        • просмотр вперёд:
          • позитивный;
          • негативный.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v4.2

04 Jun 21:50
Compare
Choose a tag to compare

Restore possibilities for error handling.

Change Log

  • lexer module:
    • Add the tokenize() function with filters:
      • implement it;
      • cover it with tests;
      • use it in the example.
    • Add the tokenize_all() function:
      • implement it;
      • cover it with tests;
      • use it in the example.
  • parser module:
    • Add the parse() function:
      • implement it;
      • cover it with tests;
      • use it in the example.
    • Add the parse_all() function:
      • implement it;
      • cover it with tests;
      • in the example:
        • use it;
        • replace the utilities::integral_infinity constant to a code size in an exception.
  • exceptions module:
    • Add it.
    • Add the positional_exception class:
      • implement it;
      • use it in the example.
    • Add the unexpected_entity_exception class:
      • implement it;
      • use it in the example.

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
    • возможность исключения токенов из результирующего списка;
  • парсинг ASCII-текста:
    • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • результат:
    • представление в виде:
      • CST;
      • AST;
    • задание имени ноды в дереве;
  • парсеры:
    • терминальные:
      • пустота;
      • определённые:
        • текст;
        • лексема;
    • комбинаторы:
      • альтернатива (упорядоченная);
      • объединяющие:
        • следование;
        • повторение:
          • 0 или 1 раз (опциональность);
          • 0 или больше раз;
          • 1 или больше раз;
          • любое число раз в указанном диапазоне;
      • проверяющие:
        • исключение;
        • просмотр вперёд:
          • позитивный;
          • негативный.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v4.1

02 Jun 12:09
Compare
Choose a tag to compare

Restore possibilities to simplify a CST.

Change Log

  • Downgrade a minimal required version of the CMake build tool.
  • Improvements:
    • Stream insertion operator for the lexer::token_group type:
      • implement it;
      • use it in the example.
    • Add the parser::get_offset() function:
      • implement it;
      • cover it with tests;
      • use it in the example.
    • Add the transformers module:
      • add the transform() function:
        • implement it;
        • cover it with tests;
        • use it in the example;
      • add the remove_nothings() function:
        • implement it;
        • cover it with tests;
        • use it in the example;
      • add the join_sequences() function:
        • implement it;
        • cover it with tests;
        • use it in the example;
      • simplify the example.
  • In the example:
    • Fix a precision of constants.
    • Add the precision option:
      • parse it;
      • use it;
      • upgrade tests of evaluation;
      • fix parsing of the expression parameter.

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
  • парсинг ASCII-текста:
    • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • результат:
    • представление в виде:
      • CST;
      • AST;
    • задание имени ноды в дереве;
  • парсеры:
    • терминальные:
      • пустота;
      • определённые:
        • текст;
        • лексема;
    • комбинаторы:
      • альтернатива (упорядоченная);
      • объединяющие:
        • следование;
        • повторение:
          • 0 или 1 раз (опциональность);
          • 0 или больше раз;
          • 1 или больше раз;
          • любое число раз в указанном диапазоне;
      • проверяющие:
        • исключение;
        • просмотр вперёд:
          • позитивный;
          • негативный.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v4.0

26 Mar 22:15
Compare
Choose a tag to compare

Support evaluation of an expression in the example.

Change Log

  • In the example:
    • Simplify a grammar:
      • simplify:
        • implementation;
        • description;
      • upgrade tests:
        • remove useless tests:
          • of the lexer module;
          • of the parser module;
        • upgrade rest tests:
          • of the lexer module;
          • of the parser module.
    • Simplify a result CST:
      • remove nodes with the nothing type;
      • join nodes with the sequence type;
      • fix the walk_ast_node() function;
      • upgrade tests of the parser module.
    • Add the target option:
      • fix the options implementation;
      • upgrade tests:
        • of the lexer module;
        • of the parser module.
    • Evaluate a CST node:
      • evaluate:
        • numbers;
        • constants;
        • rest nodes:
          • with the atom type;
          • with the unary type;
          • with the function_call type;
          • with the product type;
          • with the sum type;
      • add runtime docs:
        • add a description:
          • of built-in constants;
          • of built-in functions;
        • add a table of contents.
    • Add tests of evaluation:
      • add the evaluator test group;
      • add the test_text_output() function;
      • add tests of evaluation:
        • of nodes:
          • with the atom type;
          • with the unary type;
          • with the product type;
          • with the sum type;
        • of expressions in parentheses.

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
  • парсинг ASCII-текста:
    • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • представление результата в виде дерева парсинга:
    • задание имени ноды в дереве парсинга;
  • парсеры:
    • терминальные:
      • пустота;
      • определённые:
        • текст;
        • лексема;
    • комбинаторы:
      • альтернатива (упорядоченная);
      • объединяющие:
        • следование;
        • повторение:
          • 0 или 1 раз (опциональность);
          • 0 или больше раз;
          • 1 или больше раз;
          • любое число раз в указанном диапазоне;
      • проверяющие:
        • исключение;
        • просмотр вперёд:
          • позитивный;
          • негативный.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v3.2

13 Mar 00:23
Compare
Choose a tag to compare

Add unit tests.

Change Log

  • Improve errors handling in the example tests runner.
  • Add tests:
    • unit tests:
      • in the building configuration:
        • describe tests building;
        • add a custom target as a workaround for CMake bugs;
      • for the lexer module:
        • add utility features for the token class:
          • operators:
            • == operator;
            • stream insertion operator;
          • to_tuple() function;
        • make functions public:
          • match_lexeme() function;
          • find_matched_token() function;
        • add tests for functions:
          • get_offset() function;
          • match_lexeme() function;
          • find_matched_token() function;
          • tokenize() function;
      • for the parser module:
        • add utility features for the ast_node class:
          • operators:
            • == operator;
            • stream insertion operator;
          • to_tuple() function;
        • add tests for classes:
          • without mocks:
            • empty_parser class;
            • match_parser class;
          • with mocks:
            • alternation_parser class;
            • concatenation_parser class;
            • dummy_parser class;
            • exception_parser class;
            • lookahead_parser class;
            • repetition_parser class;
            • typing_parser class;
    • for the example:
      • add utility features:
        • add the errors test group;
        • rename the io_test() function to test_json_output();
        • add the test_error_output() function;
      • add general test cases for all error types.

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
  • парсинг ASCII-текста:
    • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • представление результата в виде дерева парсинга:
    • задание имени ноды в дереве парсинга;
  • парсеры:
    • терминальные:
      • пустота;
      • определённые:
        • текст;
        • лексема;
    • комбинаторы:
      • альтернатива (упорядоченная);
      • объединяющие:
        • следование;
        • повторение:
          • 0 или 1 раз (опциональность);
          • 0 или больше раз;
          • 1 или больше раз;
          • любое число раз в указанном диапазоне;
      • проверяющие:
        • исключение;
        • просмотр вперёд:
          • позитивный;
          • негативный.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v3.1

03 Feb 22:24
Compare
Choose a tag to compare

Add offsets to nodes, remove lifting, combining and ignoring nodes, remove throwing exceptions, use the ericniebler/range-v3 library.

Change Log

  • Fix logic of the parser::repetition_parser::parse_and_count() method.
  • Support -- as a separator of options and positional arguments in the example.
  • Add an offset to a node:
    • move the parser::integral_infinity constant to the utilities module;
    • add:
      • lexer::get_offset() function;
      • parser::ast_node::offset field;
    • set a node offset in some parsers:
      • empty_parser class;
      • match_parser class;
      • repetition_parser class;
      • lookahead_parser class;
    • fix the example:
      • replace nodes offsets equal to the utilities::integral_infinity constant to a code size;
      • output offsets:
        • in tokens;
        • in nodes.
  • Remove:
    • ignoring nothing and eoi nodes;
    • combining sequence nodes:
      • refactoring:
        • of the parser::concatenation_parser::parse() method;
        • of the parser::repetition_parser::parse() method;
    • lifting:
      • remove:
        • parser::important_assignable_parser class;
        • parser::lift_parser class;
    • exceptions:
      • simplify the lexer::tokenize() function;
      • remove:
        • parser::parse() function;
        • parser::eoi_parser class;
        • exceptions module.
  • Refactoring:
    • of the parser::type_assignable_parser class:
      • rename it to typing_parser;
      • refactoring of the parse() method;
      • combine:
        • assignable_parser and typing_parser classes in a single class;
        • typing_parser class and RULE macro in a single file;
    • use the ericniebler/range-v3 library:
      • in the lexer module;
      • in the example.

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
  • парсинг ASCII-текста:
    • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • представление результата в виде дерева парсинга:
    • задание имени ноды в дереве парсинга;
  • парсеры:
    • терминальные:
      • пустота;
      • определённые:
        • текст;
        • лексема;
    • комбинаторы:
      • альтернатива (упорядоченная);
      • объединяющие:
        • следование;
        • повторение:
          • 0 или 1 раз (опциональность);
          • 0 или больше раз;
          • 1 или больше раз;
          • любое число раз в указанном диапазоне;
      • проверяющие:
        • исключение;
        • просмотр вперёд:
          • позитивный;
          • негативный.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v3.0

27 Jan 07:37
Compare
Choose a tag to compare

Revision of errors handling, removing some possibilities and global refactoring.

Change Log

  • Processing errors:
    • Add the universal exception for an unexpected entity.
    • Symplify processing an error:
      • with an unexpected symbol;
      • with an unexpected token;
      • with an unexpected EOI.
  • Remove:
    • code entities:
      • header including all parsers;
      • functions:
        • function for repeating in a range of times;
        • overload of the parser::parse() function accepting a string;
      • operators:
        • for repeating an exact number of times;
        • for parsing separated lists;
    • possibilities:
      • ignoring some tokens;
      • auto-selection:
        • of longest token;
        • of longest node;
      • serialization to JSON:
        • from the lexer module;
        • from the parser module.
  • Refactoring:
    • of the lexer module:
      • combine in a single file:
        • token and token_group types;
      • add new types:
        • lexeme_group type alias;
        • token_span type alias;
      • refactoring:
        • of the find_matched_token() function;
        • of the tokenize() function;
    • of the parser module:
      • simplify a code of parsers;
      • combine in a single file:
        • ast_node_flag and ast_node types;
        • parsing_result and rule_parser types;
        • match_type and match_parser types;
      • add new types:
        • ast_node_group type alias;
      • replace:
        • magic constants of AST node types to an enumeration;
        • custom bitwise operators for the ast_node_flag enumeration to using the grisumbras/enum-flags library;
        • mutable instances in parameters to constant references;
      • remove:
        • some C++ class specifiers;
        • usages of move semantics;
      • refactoring:
        • of the append_node() function;
        • of the repetition_parser::parse() method;
    • of the utilities module:
      • rename it to exceptions;
      • replace:
        • mutable instances in parameters to constant references;
      • remove:
        • usages of move semantics;
    • of the example:
      • combine in a single function:
        • make_atom_parser() and make_expression_parser() functions;
      • refactoring:
        • of the grammar;
        • of the main() function;
        • of the tests runner.

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
  • парсинг ASCII-текста;
  • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • представление результата в виде AST;
  • задание имени ноды в AST;
  • комбинаторы:
    • следование;
    • упорядоченная альтернатива;
    • повторение:
      • 0 или 1 раз (опциональность);
      • 0 или больше раз;
      • 1 или больше раз;
    • исключение;
    • просмотр вперёд:
      • позитивный;
      • негативный;
  • парсеры:
    • пустота;
    • конец текста;
    • определённый текст;
    • определённая лексема.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v2.2

23 Dec 03:37
Compare
Choose a tag to compare

Migrate to the C++17 standard and update dependencies.

Change Log

  • Simplify the building configurations
  • Migrate to the C++17 standard:
    • Specify the standard in the building configurations
    • Replace the optional type from the akrzemi1/Optional library to the std::optional type
    • Replace the string_span type from the Microsoft/GSL library to the std::string_view type
    • Use nested namespaces
  • Update dependencies:
  • Project design:
    • Use upper-case names for service files
    • Fix the license information

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
    • возможность исключения токенов из результирующего списка;
  • парсинг ASCII-текста;
  • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • представление результата в виде AST;
  • задание имени ноды в AST;
  • сериализация AST в JSON;
  • комбинаторы:
    • следование;
    • альтернатива;
    • повторение:
      • 0 или 1 раз (опциональность);
      • конкретное число раз;
      • 0 или больше раз;
      • 1 или больше раз;
    • исключение;
    • просмотр вперёд:
      • позитивный;
      • негативный;
    • список с разделителем;
  • парсеры:
    • пустота;
    • конец текста;
    • определённый текст;
    • определённая лексема.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ

v2.1

17 Mar 19:11
Compare
Choose a tag to compare

Рефакторинг, добавление новых парсеров и комбинаторов и покрытие примера тестами.

Изменения

  • Убрать ненужную универсальность из парсера флагов #23
  • Вынести общую функциональность из парсеров с присваиванием #22
  • Добавить парсер пустоты #21
  • Добавить комбинатор списка с разделителем #20
  • Заменить комбинатор опциональности на комбинатор повторений #19
  • Добавить поддержку негативного просмотра вперёд в комбинатор просмотра вперёд #18
  • Переименовать комбинатор сокрытия ноды в комбинатор просмотра вперёд #17
  • Объединить парсеры определённого текста и определённой лексемы #16
  • Добавить поддержку указания лимитов в комбинаторе повторений #15
  • Заменить иерархию парсеров на её листья #14
  • Заменить итераторы токенов на тип span из библиотеки Microsoft/GSL #13
  • Заменить класс lexer::tokenizer на набор функций #12
  • Заменить строковые итераторы на тип string_span из библиотеки Microsoft/GSL #11
  • Добавить тесты из Wizard Steps (на основе Bats) для примера #10
  • Добавить поддержку чтения выражения из stdin в пример #9
  • Добавить опцию -t/--tokens для вывода списка токенов в пример #8
  • Использовать библиотеку docopt/docopt.cpp для парсинга опций в примере #7
  • Использовать библиотеку fmtlib/fmt для форматирования строк #6
  • Заменить флаг parser::parsing_result::is_parsed на тип optional из библиотеки akrzemi1/Optional #5
  • Заменить тип std::pair<T, bool> на тип optional из библиотеки akrzemi1/Optional #4
  • Удалить функцию utilities::contains() #3
  • Использовать библиотеку nlohmann/json для сериализации #2
  • Реализовать функцию to_string() в пару к каждой функции operator<<() #1

Возможности

  • лексинг ASCII-текста:
    • задание лексем посредством регулярных выражений;
    • возможность исключения токенов из результирующего списка;
  • парсинг ASCII-текста;
  • описание грамматики на EBNF непосредственно в коде программы (посредством DSL);
  • представление результата в виде AST;
  • задание имени ноды в AST;
  • сериализация AST в JSON;
  • комбинаторы:
    • следование;
    • альтернатива;
    • повторение:
      • 0 или 1 раз (опциональность);
      • конкретное число раз;
      • 0 или больше раз;
      • 1 или больше раз;
    • исключение;
    • просмотр вперёд:
      • позитивный;
      • негативный;
    • список с разделителем;
  • парсеры:
    • пустота;
    • конец текста;
    • определённый текст;
    • определённая лексема.

Скриншоты

Лексический анализ

Лексический анализ

Синтаксический анализ

Синтаксический анализ