From c7af5df3824d2494c01133bf9d999afa773a05b1 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Thu, 30 May 2019 19:20:41 +0200 Subject: [PATCH] git subrepo pull packages/PEGTL subrepo: subdir: "packages/PEGTL" merged: "293ef9f54" upstream: origin: "git@github.com:taocpp/PEGTL.git" branch: "master" commit: "293ef9f54" git-subrepo: version: "0.4.0" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "5d6aba9" --- packages/PEGTL/.conan/build.py | 8 +- packages/PEGTL/.gitignore | 1 + packages/PEGTL/.gitrepo | 4 +- packages/PEGTL/.travis.yml | 20 +- packages/PEGTL/CMakeLists.txt | 15 +- packages/PEGTL/README.md | 43 +- packages/PEGTL/doc/Changelog.md | 8 + packages/PEGTL/doc/Contrib-and-Examples.md | 6 +- packages/PEGTL/doc/Installing-and-Using.md | 2 + packages/PEGTL/doc/Parse-Tree.png | Bin 59564 -> 0 bytes packages/PEGTL/doc/Parse-Tree.svg | 157 +++++++ packages/PEGTL/doc/README.md | 1 - packages/PEGTL/doc/Rule-Reference.md | 5 - packages/PEGTL/doc/Thank-You.md | 41 -- packages/PEGTL/include/tao/pegtl.hpp | 5 +- .../include/tao/pegtl/contrib/integer.hpp | 436 ++++++++++++++++-- .../PEGTL/include/tao/pegtl/contrib/json.hpp | 6 +- .../tao/pegtl/contrib/json_pointer.hpp | 33 ++ .../PEGTL/include/tao/pegtl/contrib/uri.hpp | 9 +- .../PEGTL/src/test/pegtl/ascii_forty_two.cpp | 6 +- .../PEGTL/src/test/pegtl/contrib_integer.cpp | 154 ++++++- .../PEGTL/src/test/pegtl/rule_rematch.cpp | 20 +- .../PEGTL/src/test/pegtl/utf16_general.cpp | 160 +++---- packages/PEGTL/src/test/pegtl/verify_rule.hpp | 6 +- 24 files changed, 914 insertions(+), 232 deletions(-) delete mode 100644 packages/PEGTL/doc/Parse-Tree.png create mode 100644 packages/PEGTL/doc/Parse-Tree.svg delete mode 100644 packages/PEGTL/doc/Thank-You.md create mode 100644 packages/PEGTL/include/tao/pegtl/contrib/json_pointer.hpp diff --git a/packages/PEGTL/.conan/build.py b/packages/PEGTL/.conan/build.py index 838e79755..d558f1f9c 100644 --- a/packages/PEGTL/.conan/build.py +++ b/packages/PEGTL/.conan/build.py @@ -52,17 +52,17 @@ class BuilderSettings(object): @property def reference(self): - """ Read project version from CMake file to create Conan referece + """ Read project version from version.hpp file to create Conan referece """ - pattern = re.compile(r"project\(pegtl VERSION (\d+\.\d+\.\d+) LANGUAGES CXX\)") + pattern = re.compile(r"#define TAO_PEGTL_VERSION \"(\d+\.\d+\.\d+)\"") version = None - with open('CMakeLists.txt') as file: + with open('include/tao/pegtl/version.hpp') as file: for line in file: result = pattern.match(line) if result: version = result.group(1) if not version: - raise Exception("Could not find version in CMakeLists.txt") + raise Exception("Could not find version in version.hpp") return os.getenv("CONAN_REFERENCE", "pegtl/{}@taocpp/stable".format(version)) if __name__ == "__main__": diff --git a/packages/PEGTL/.gitignore b/packages/PEGTL/.gitignore index 454bccb45..90173b58d 100644 --- a/packages/PEGTL/.gitignore +++ b/packages/PEGTL/.gitignore @@ -1,3 +1,4 @@ *~ build private +/.vs diff --git a/packages/PEGTL/.gitrepo b/packages/PEGTL/.gitrepo index 943a88058..b7e013522 100644 --- a/packages/PEGTL/.gitrepo +++ b/packages/PEGTL/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = git@github.com:taocpp/PEGTL.git branch = master - commit = 68790bd2c25fceff1049e9fc2fb9528ca4d93bbf - parent = 0fc26ddb5da553e9b9ddff3db48b3d6a1617eb96 + commit = 293ef9f549bfde12f78c6117a6d13a1f5b9879d2 + parent = 512de6bdac8531e32026970fcf476a1a1154ae62 cmdver = 0.4.0 method = merge diff --git a/packages/PEGTL/.travis.yml b/packages/PEGTL/.travis.yml index 32500f242..efdead2af 100644 --- a/packages/PEGTL/.travis.yml +++ b/packages/PEGTL/.travis.yml @@ -20,6 +20,14 @@ matrix: env: - CXX=g++-8 + - compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-9'] + env: + - CXX=g++-9 + - compiler: clang addons: apt: @@ -77,9 +85,9 @@ matrix: addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-8'] + packages: ['g++-9'] env: - - CXX=g++-8 + - CXX=g++-9 - CPPFLAGS="-fsanitize=undefined -fuse-ld=gold" - compiler: gcc @@ -87,9 +95,9 @@ matrix: addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-8'] + packages: ['g++-9'] env: - - CXX=g++-8 + - CXX=g++-9 - CPPFLAGS="-fsanitize=address -fuse-ld=gold" - compiler: clang @@ -135,9 +143,9 @@ matrix: addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-8', 'valgrind'] + packages: ['g++-9', 'valgrind'] env: - - CXX=g++-8 + - CXX=g++-9 - SPECIAL=valgrind script: - make -kj3 valgrind diff --git a/packages/PEGTL/CMakeLists.txt b/packages/PEGTL/CMakeLists.txt index 410ec90d1..0fe7e8e7a 100644 --- a/packages/PEGTL/CMakeLists.txt +++ b/packages/PEGTL/CMakeLists.txt @@ -1,6 +1,11 @@ cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR) -project(pegtl VERSION 3.0.0 LANGUAGES CXX) +# Read version from version.hpp +file(READ "${CMAKE_CURRENT_LIST_DIR}/include/tao/pegtl/version.hpp" version_hpp_data) +string(REGEX MATCH "#define TAO_PEGTL_VERSION \"([^\"]+)\"" _ ${version_hpp_data}) +set(PEGTL_VERSION "${CMAKE_MATCH_1}") + +project(pegtl VERSION ${PEGTL_VERSION} LANGUAGES CXX) if(${PROJECT_NAME}_FOUND) # Multiple versions of PEGTL can't co-exist @@ -55,6 +60,13 @@ endif() # Make package findable configure_file(cmake/dummy-config.cmake.in pegtl-config.cmake @ONLY) +# Ignore pointer width differences since this is a header-only library +unset(CMAKE_SIZEOF_VOID_P) + +# Enable version checks in find_package +include(CMakePackageConfigHelpers) +write_basic_package_version_file(pegtl-config-version.cmake COMPATIBILITY SameMajorVersion) + # install and export target install(TARGETS pegtl EXPORT pegtl-targets) @@ -64,5 +76,6 @@ install(EXPORT pegtl-targets DESTINATION ${PEGTL_INSTALL_CMAKE_DIR} ) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pegtl-config-version.cmake DESTINATION ${PEGTL_INSTALL_CMAKE_DIR}) install(DIRECTORY include/ DESTINATION ${PEGTL_INSTALL_INCLUDE_DIR}) install(FILES LICENSE DESTINATION ${PEGTL_INSTALL_DOC_DIR}) diff --git a/packages/PEGTL/README.md b/packages/PEGTL/README.md index d9798a226..089408179 100644 --- a/packages/PEGTL/README.md +++ b/packages/PEGTL/README.md @@ -69,7 +69,7 @@ Each commit is automatically tested with multiple architectures, operating syste * Ubuntu 16.04 LTS (using libstdc++) - * GCC 7.x, 8.x + * GCC 7.x, 8.x, 9.x * Clang 5.x, 6.x, 7.x, 8.x Additionally, each commit is checked with Clang's [Static Analyzer](https://clang-analyzer.llvm.org/), GCC's and Clang's [sanitizers](https://github.com/google/sanitizers), [`clang-tidy`](http://clang.llvm.org/extra/clang-tidy/), and [`valgrind`](http://valgrind.org/). @@ -79,11 +79,48 @@ Code coverage is automatically measured and the unit tests cover 100% of the cor Incompatible API changes are *only* allowed to occur between major versions. For details see the [changelog](doc/Changelog.md). -## Contact +## Thank You + +In appreciation of all contributions here are the people that have [directly contributed](https://github.com/taocpp/PEGTL/graphs/contributors) to the PEGTL and/or its development. + +[<img alt="andoma" src="https://avatars2.githubusercontent.com/u/216384?v=4&s=117" width="117">](https://github.com/andoma) +[<img alt="Bjoe" src="https://avatars3.githubusercontent.com/u/727911?v=4&s=117" width="117">](https://github.com/Bjoe) +[<img alt="bwagner" src="https://avatars3.githubusercontent.com/u/447049?v=4&s=117" width="117">](https://github.com/bwagner) +[<img alt="cdiggins" src="https://avatars2.githubusercontent.com/u/1759994?s=460&v=4?v=4&s=117" width="117">](https://github.com/cdiggins) +[<img alt="delpinux" src="https://avatars0.githubusercontent.com/u/35096584?v=4&s=117" width="117">](https://github.com/delpinux) +[<img alt="dkopecek" src="https://avatars2.githubusercontent.com/u/1353140?v=4&s=117" width="117">](https://github.com/dkopecek) +[<img alt="irrequietus" src="https://avatars0.githubusercontent.com/u/231192?v=4&s=117" width="117">](https://github.com/irrequietus) +[<img alt="jedelbo" src="https://avatars2.githubusercontent.com/u/572755?v=4&s=117" width="117">](https://github.com/jedelbo) +[<img alt="joelfrederico" src="https://avatars0.githubusercontent.com/u/458871?v=4&s=117" width="117">](https://github.com/joelfrederico) +[<img alt="jovermann" src="https://avatars3.githubusercontent.com/u/6087443?v=4&s=117" width="117">](https://github.com/jovermann) +[<img alt="kneth" src="https://avatars0.githubusercontent.com/u/1225363?v=4&s=117" width="117">](https://github.com/kneth) +[<img alt="kuzmas" src="https://avatars1.githubusercontent.com/u/1858553?v=4&s=117" width="117">](https://github.com/kuzmas) +[<img alt="lambdafu" src="https://avatars1.githubusercontent.com/u/1138455?v=4&s=117" width="117">](https://github.com/lambdafu) +[<img alt="lichray" src="https://avatars2.githubusercontent.com/u/433009?v=4&s=117" width="117">](https://github.com/lichray) +[<img alt="michael-brade" src="https://avatars0.githubusercontent.com/u/8768950?v=4&s=117" width="117">](https://github.com/michael-brade) +[<img alt="mkrupcale" src="https://avatars1.githubusercontent.com/u/13936020?v=4&s=117" width="117">](https://github.com/mkrupcale) +[<img alt="NewProggie" src="https://avatars3.githubusercontent.com/u/162319?s=460&v=4?v=4&s=117" width="117">](https://github.com/NewProggie) +[<img alt="pauloscustodio" src="https://avatars1.githubusercontent.com/u/70773?v=4&s=117" width="117">](https://github.com/pauloscustodio) +[<img alt="pleroux0" src="https://avatars2.githubusercontent.com/u/39619854?v=4&s=117" width="117">](https://github.com/pleroux0) +[<img alt="quadfault" src="https://avatars3.githubusercontent.com/u/30195320?v=4&s=117" width="117">](https://github.com/quadfault) +[<img alt="samhocevar" src="https://avatars2.githubusercontent.com/u/245089?v=4&s=117" width="117">](https://github.com/samhocevar) +[<img alt="sanssecours" src="https://avatars2.githubusercontent.com/u/691989?v=4&s=117" width="117">](https://github.com/sanssecours) +[<img alt="sgbeal" src="https://avatars1.githubusercontent.com/u/235303?v=4&s=117" width="117">](https://github.com/sgbeal) +[<img alt="studoot" src="https://avatars1.githubusercontent.com/u/799344?v=4&s=117" width="117">](https://github.com/studoot) +[<img alt="SvenJo" src="https://avatars1.githubusercontent.com/u/1538181?s=460&v=4?v=4&s=117" width="117">](https://github.com/SvenJo) +[<img alt="wickedmic" src="https://avatars1.githubusercontent.com/u/12001183?v=4&s=117" width="117">](https://github.com/wickedmic) +[<img alt="wravery" src="https://avatars0.githubusercontent.com/u/6502881?v=4&s=117" width="117">](https://github.com/wravery) +[<img alt="zhihaoy" src="https://avatars2.githubusercontent.com/u/43971430?v=4&s=117" width="117">](https://github.com/zhihaoy) + +## The Art of C++ The PEGTL is part of [The Art of C++](https://taocpp.github.io/). -We [are grateful](doc/Thank-You.md) for all support and contributions. +[<img alt="ColinH" src="https://avatars0.githubusercontent.com/u/113184?v=4&s=117" width="117">](https://github.com/ColinH) +[<img alt="d-frey" src="https://avatars2.githubusercontent.com/u/3956325?v=4&s=117" width="117">](https://github.com/d-frey) +[<img alt="uilianries" src="https://avatars0.githubusercontent.com/u/4870173?v=4&s=117" width="117">](https://github.com/uilianries) + +## Contact For questions and suggestions regarding the PEGTL, success or failure stories, and any other kind of feedback, please feel free to open an issue or a PR on GitHub or contact the authors at `taocpp(at)icemx.net`. diff --git a/packages/PEGTL/doc/Changelog.md b/packages/PEGTL/doc/Changelog.md index 37b4184c7..9fc17ba38 100644 --- a/packages/PEGTL/doc/Changelog.md +++ b/packages/PEGTL/doc/Changelog.md @@ -10,6 +10,8 @@ * The macro `TAO_PEGTL_NAMESPACE` now contains the fully qualified namespace, e.g. `tao::pegtl`. * Replaced `tao::pegtl::input_error` with `std::system_error`. * Changed message of `tao::pegtl::parse_error` to no longer contain the position redundantly. +* Changed rules in `tao/pegtl/contrib/integer.hpp` to not accept redundant leading zeros. +* Added rules to `tao/pegtl/contrib/integer.hpp` that test unsigned values against a maximum. * Removed option of [state](Rule-Reference.md#state-s-r-)'s `S::success()` to have an extended signature to get access to the current `apply_mode`, `rewind_mode`, *action*- and *control* class (template). * Added `[[nodiscard]]` to most non-void functions. * Removed compatibility macros starting with `TAOCPP_PEGTL_`. @@ -17,6 +19,12 @@ * Removed compatibility `peek_byte()` member functions. * Removed compatibility header `changes.hpp` from contrib. +## 2.8.1 + +**Not yet released** + +* Fixed missing `string_input<>` in amalgamated header. + ## 2.8.0 Released 2019-04-09 diff --git a/packages/PEGTL/doc/Contrib-and-Examples.md b/packages/PEGTL/doc/Contrib-and-Examples.md index f83cc6cf1..7f844ad13 100644 --- a/packages/PEGTL/doc/Contrib-and-Examples.md +++ b/packages/PEGTL/doc/Contrib-and-Examples.md @@ -206,12 +206,12 @@ The example shows how to choose which rules will produce a parse tree node, whic The output is in [DOT](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) format and can be converted into a graph. ```sh -$ build/src/example/pegtl/parse_tree "(2*a + 3*b) / (4*n)" | dot -Tpng -o parse_tree.png +$ build/src/example/pegtl/parse_tree "(2*a + 3*b) / (4*n)" | dot -Tsvg -o parse_tree.svg ``` -The above will generate a PNG with a graphical representation of the parse tree. +The above will generate an SVG file with a graphical representation of the parse tree. - + ###### `src/example/pegtl/proto3.cpp` diff --git a/packages/PEGTL/doc/Installing-and-Using.md b/packages/PEGTL/doc/Installing-and-Using.md index d0b78a470..7b73f2236 100644 --- a/packages/PEGTL/doc/Installing-and-Using.md +++ b/packages/PEGTL/doc/Installing-and-Using.md @@ -36,6 +36,8 @@ on either It requires C++17, e.g. using the `--std=c++17` compiler switch. Using newer versions of the C++ standard is supported. +Larger projects will frequently require the `/bigobj` option when compiling with Visual Studio on Windows. + It should also work with other C++17 compilers on other Unix systems (or any sufficiently compatible platform). The PEGTL is written with an emphasis on clean code and is compatible with diff --git a/packages/PEGTL/doc/Parse-Tree.png b/packages/PEGTL/doc/Parse-Tree.png deleted file mode 100644 index fcacd0611dbb67c7516dbc0df9c54211d21d3ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59564 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 Hr-UW|J)&VW diff --git a/packages/PEGTL/doc/Parse-Tree.svg b/packages/PEGTL/doc/Parse-Tree.svg new file mode 100644 index 000000000..87792aff9 --- /dev/null +++ b/packages/PEGTL/doc/Parse-Tree.svg @@ -0,0 +1,157 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by graphviz version 2.40.1 (0) + --> +<!-- Title: parse_tree Pages: 1 --> +<svg width="1063pt" height="367pt" + viewBox="0.00 0.00 1062.99 367.48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 363.4802)"> +<title>parse_tree</title> +<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-363.4802 1058.9899,-363.4802 1058.9899,4 -4,4"/> +<!-- x0x1604e70 --> +<g id="node1" class="node"> +<title>x0x1604e70</title> +<ellipse fill="none" stroke="#000000" cx="632.8736" cy="-341.4802" rx="39.7935" ry="18"/> +<text text-anchor="middle" x="632.8736" y="-337.7802" font-family="Times,serif" font-size="14.00" fill="#000000">ROOT</text> +</g> +<!-- x0x1605200 --> +<g id="node2" class="node"> +<title>x0x1605200</title> +<ellipse fill="none" stroke="#000000" cx="632.8736" cy="-269.4802" rx="83.6854" ry="18"/> +<text text-anchor="middle" x="632.8736" y="-265.7802" font-family="Times,serif" font-size="14.00" fill="#000000">example::divide</text> +</g> +<!-- x0x1604e70->x0x1605200 --> +<g id="edge1" class="edge"> +<title>x0x1604e70->x0x1605200</title> +<path fill="none" stroke="#000000" d="M632.8736,-323.3116C632.8736,-315.6112 632.8736,-306.4546 632.8736,-297.8969"/> +<polygon fill="#000000" stroke="#000000" points="636.3737,-297.8935 632.8736,-287.8935 629.3737,-297.8935 636.3737,-297.8935"/> +</g> +<!-- x0x16053b0 --> +<g id="node3" class="node"> +<title>x0x16053b0</title> +<ellipse fill="none" stroke="#000000" cx="528.8736" cy="-197.4802" rx="75.2868" ry="18"/> +<text text-anchor="middle" x="528.8736" y="-193.7802" font-family="Times,serif" font-size="14.00" fill="#000000">example::plus</text> +</g> +<!-- x0x1605200->x0x16053b0 --> +<g id="edge2" class="edge"> +<title>x0x1605200->x0x16053b0</title> +<path fill="none" stroke="#000000" d="M607.963,-252.2344C594.199,-242.7055 576.9218,-230.7443 562.0293,-220.4341"/> +<polygon fill="#000000" stroke="#000000" points="563.7951,-217.3998 553.581,-214.5853 559.8106,-223.1551 563.7951,-217.3998"/> +</g> +<!-- x0x1605a60 --> +<g id="node4" class="node"> +<title>x0x1605a60</title> +<ellipse fill="none" stroke="#000000" cx="737.8736" cy="-197.4802" rx="94.4839" ry="18"/> +<text text-anchor="middle" x="737.8736" y="-193.7802" font-family="Times,serif" font-size="14.00" fill="#000000">example::multiply</text> +</g> +<!-- x0x1605200->x0x1605a60 --> +<g id="edge3" class="edge"> +<title>x0x1605200->x0x1605a60</title> +<path fill="none" stroke="#000000" d="M658.0237,-252.2344C671.8187,-242.775 689.109,-230.9188 704.0695,-220.6602"/> +<polygon fill="#000000" stroke="#000000" points="706.2969,-223.3767 712.5648,-214.8348 702.3381,-217.6036 706.2969,-223.3767"/> +</g> +<!-- x0x1605560 --> +<g id="node5" class="node"> +<title>x0x1605560</title> +<ellipse fill="none" stroke="#000000" cx="312.8736" cy="-116.6102" rx="94.4839" ry="18"/> +<text text-anchor="middle" x="312.8736" y="-112.9102" font-family="Times,serif" font-size="14.00" fill="#000000">example::multiply</text> +</g> +<!-- x0x16053b0->x0x1605560 --> +<g id="edge4" class="edge"> +<title>x0x16053b0->x0x1605560</title> +<path fill="none" stroke="#000000" d="M488.2457,-182.2692C453.5814,-169.2909 403.4996,-150.5404 365.7225,-136.3967"/> +<polygon fill="#000000" stroke="#000000" points="366.5019,-132.9513 355.9096,-132.7228 364.0475,-139.5069 366.5019,-132.9513"/> +</g> +<!-- x0x16057e0 --> +<g id="node6" class="node"> +<title>x0x16057e0</title> +<ellipse fill="none" stroke="#000000" cx="528.8736" cy="-116.6102" rx="94.4839" ry="18"/> +<text text-anchor="middle" x="528.8736" y="-112.9102" font-family="Times,serif" font-size="14.00" fill="#000000">example::multiply</text> +</g> +<!-- x0x16053b0->x0x16057e0 --> +<g id="edge5" class="edge"> +<title>x0x16053b0->x0x16057e0</title> +<path fill="none" stroke="#000000" d="M528.8736,-179.1296C528.8736,-169.1 528.8736,-156.4555 528.8736,-145.1666"/> +<polygon fill="#000000" stroke="#000000" points="532.3737,-144.8882 528.8736,-134.8882 525.3737,-144.8883 532.3737,-144.8882"/> +</g> +<!-- x0x16059d0 --> +<g id="node11" class="node"> +<title>x0x16059d0</title> +<ellipse fill="none" stroke="#000000" cx="737.8736" cy="-116.6102" rx="96.7474" ry="26.7407"/> +<text text-anchor="middle" x="737.8736" y="-120.4102" font-family="Times,serif" font-size="14.00" fill="#000000">example::integer</text> +<text text-anchor="middle" x="737.8736" y="-105.4102" font-family="Times,serif" font-size="14.00" fill="#000000">"4"</text> +</g> +<!-- x0x1605a60->x0x16059d0 --> +<g id="edge10" class="edge"> +<title>x0x1605a60->x0x16059d0</title> +<path fill="none" stroke="#000000" d="M737.8736,-179.1296C737.8736,-171.5597 737.8736,-162.5002 737.8736,-153.6583"/> +<polygon fill="#000000" stroke="#000000" points="741.3737,-153.4808 737.8736,-143.4808 734.3737,-153.4808 741.3737,-153.4808"/> +</g> +<!-- x0x1605b10 --> +<g id="node12" class="node"> +<title>x0x1605b10</title> +<ellipse fill="none" stroke="#000000" cx="953.8736" cy="-116.6102" rx="101.2327" ry="26.7407"/> +<text text-anchor="middle" x="953.8736" y="-120.4102" font-family="Times,serif" font-size="14.00" fill="#000000">example::variable</text> +<text text-anchor="middle" x="953.8736" y="-105.4102" font-family="Times,serif" font-size="14.00" fill="#000000">"n"</text> +</g> +<!-- x0x1605a60->x0x1605b10 --> +<g id="edge11" class="edge"> +<title>x0x1605a60->x0x1605b10</title> +<path fill="none" stroke="#000000" d="M780.8065,-181.4062C810.7205,-170.2065 851.2523,-155.0314 885.5715,-142.1824"/> +<polygon fill="#000000" stroke="#000000" points="886.9346,-145.4094 895.0725,-138.6252 884.4801,-138.8538 886.9346,-145.4094"/> +</g> +<!-- x0x16054d0 --> +<g id="node7" class="node"> +<title>x0x16054d0</title> +<ellipse fill="none" stroke="#000000" cx="96.8736" cy="-26.8701" rx="96.7474" ry="26.7407"/> +<text text-anchor="middle" x="96.8736" y="-30.6701" font-family="Times,serif" font-size="14.00" fill="#000000">example::integer</text> +<text text-anchor="middle" x="96.8736" y="-15.6701" font-family="Times,serif" font-size="14.00" fill="#000000">"2"</text> +</g> +<!-- x0x1605560->x0x16054d0 --> +<g id="edge6" class="edge"> +<title>x0x1605560->x0x16054d0</title> +<path fill="none" stroke="#000000" d="M273.2559,-100.1505C241.728,-87.0518 196.9923,-68.4657 160.464,-53.2895"/> +<polygon fill="#000000" stroke="#000000" points="161.4608,-49.9137 150.8832,-49.3091 158.7751,-56.378 161.4608,-49.9137"/> +</g> +<!-- x0x1605610 --> +<g id="node8" class="node"> +<title>x0x1605610</title> +<ellipse fill="none" stroke="#000000" cx="312.8736" cy="-26.8701" rx="101.2327" ry="26.7407"/> +<text text-anchor="middle" x="312.8736" y="-30.6701" font-family="Times,serif" font-size="14.00" fill="#000000">example::variable</text> +<text text-anchor="middle" x="312.8736" y="-15.6701" font-family="Times,serif" font-size="14.00" fill="#000000">"a"</text> +</g> +<!-- x0x1605560->x0x1605610 --> +<g id="edge7" class="edge"> +<title>x0x1605560->x0x1605610</title> +<path fill="none" stroke="#000000" d="M312.8736,-98.4499C312.8736,-88.5469 312.8736,-75.9148 312.8736,-64.0273"/> +<polygon fill="#000000" stroke="#000000" points="316.3737,-63.8597 312.8736,-53.8597 309.3737,-63.8597 316.3737,-63.8597"/> +</g> +<!-- x0x1605750 --> +<g id="node9" class="node"> +<title>x0x1605750</title> +<ellipse fill="none" stroke="#000000" cx="528.8736" cy="-26.8701" rx="96.7474" ry="26.7407"/> +<text text-anchor="middle" x="528.8736" y="-30.6701" font-family="Times,serif" font-size="14.00" fill="#000000">example::integer</text> +<text text-anchor="middle" x="528.8736" y="-15.6701" font-family="Times,serif" font-size="14.00" fill="#000000">"3"</text> +</g> +<!-- x0x16057e0->x0x1605750 --> +<g id="edge8" class="edge"> +<title>x0x16057e0->x0x1605750</title> +<path fill="none" stroke="#000000" d="M528.8736,-98.4499C528.8736,-88.5469 528.8736,-75.9148 528.8736,-64.0273"/> +<polygon fill="#000000" stroke="#000000" points="532.3737,-63.8597 528.8736,-53.8597 525.3737,-63.8597 532.3737,-63.8597"/> +</g> +<!-- x0x1605890 --> +<g id="node10" class="node"> +<title>x0x1605890</title> +<ellipse fill="none" stroke="#000000" cx="744.8736" cy="-26.8701" rx="101.2327" ry="26.7407"/> +<text text-anchor="middle" x="744.8736" y="-30.6701" font-family="Times,serif" font-size="14.00" fill="#000000">example::variable</text> +<text text-anchor="middle" x="744.8736" y="-15.6701" font-family="Times,serif" font-size="14.00" fill="#000000">"b"</text> +</g> +<!-- x0x16057e0->x0x1605890 --> +<g id="edge9" class="edge"> +<title>x0x16057e0->x0x1605890</title> +<path fill="none" stroke="#000000" d="M568.4914,-100.1505C599.7956,-87.1447 644.1211,-68.7291 680.5048,-53.6129"/> +<polygon fill="#000000" stroke="#000000" points="682.1617,-56.7147 690.0535,-49.6458 679.476,-50.2504 682.1617,-56.7147"/> +</g> +</g> +</svg> diff --git a/packages/PEGTL/doc/README.md b/packages/PEGTL/doc/README.md index 4f98196ac..7c9acc81d 100644 --- a/packages/PEGTL/doc/README.md +++ b/packages/PEGTL/doc/README.md @@ -104,7 +104,6 @@ * [Custom Rules](Grammar-Analysis.md#custom-rules) * [Changelog](Changelog.md) * [Migration Guide](Migration-Guide.md) -* [Thank You](Thank-You.md) # Rule Reference Index diff --git a/packages/PEGTL/doc/Rule-Reference.md b/packages/PEGTL/doc/Rule-Reference.md index 85040484d..160f74372 100644 --- a/packages/PEGTL/doc/Rule-Reference.md +++ b/packages/PEGTL/doc/Rule-Reference.md @@ -103,7 +103,6 @@ These are the classical PEG combinator rules defined in namespace `tao::pegtl`. * Succeeds if and only if `seq< R... >` would succeed. * Consumes nothing, i.e. rewinds after matching. * Disables all actions. -* Allows local failure of `R...` even within `must<>` etc. ###### `not_at< R... >` @@ -111,14 +110,12 @@ These are the classical PEG combinator rules defined in namespace `tao::pegtl`. * Succeeds if and only if `seq< R... >` would **not** succeed. * Consumes nothing, i.e. rewinds after matching. * Disables all actions. -* Allows local failure of `R...` even within `must<>` etc. ###### `opt< R... >` * PEG **optional** *e*? * Optional `seq< R... >`, i.e. attempt to match `seq< R... >` and signal success regardless of the result. * Equivalent to `sor< seq< R... >, success >`. -* Allows local failure of `R...` even within `must<>` etc. ###### `plus< R... >` @@ -143,14 +140,12 @@ These are the classical PEG combinator rules defined in namespace `tao::pegtl`. * Matches the given rules `R...` in the given order. * Succeeds and stops matching when one of the given rules succeeds. * Consumes whatever the first rule that succeeded consumed. -* Allows local failure of `R...` even within `must<>` etc. * Fails if `R` is an empty rule pack. ###### `star< R... >` * PEG **zero-or-more** *e** * Matches `seq< R... >` as often as possible and always succeeds. -* Allows local failure of `R...` even within `must<>` etc. * `R` must be a non-empty rule pack. ## Convenience diff --git a/packages/PEGTL/doc/Thank-You.md b/packages/PEGTL/doc/Thank-You.md deleted file mode 100644 index 63beb187c..000000000 --- a/packages/PEGTL/doc/Thank-You.md +++ /dev/null @@ -1,41 +0,0 @@ -# Thank You - -In appreciation of all contributions here are the people that have [directly contributed](https://github.com/taocpp/PEGTL/graphs/contributors) to the PEGTL and/or its development. - -[<img alt="andoma" src="https://avatars2.githubusercontent.com/u/216384?v=4&s=117" width="117">](https://github.com/andoma) -[<img alt="Bjoe" src="https://avatars3.githubusercontent.com/u/727911?v=4&s=117" width="117">](https://github.com/Bjoe) -[<img alt="bwagner" src="https://avatars3.githubusercontent.com/u/447049?v=4&s=117" width="117">](https://github.com/bwagner) -[<img alt="cdiggins" src="https://avatars2.githubusercontent.com/u/1759994?s=460&v=4?v=4&s=117" width="117">](https://github.com/cdiggins) -[<img alt="delpinux" src="https://avatars0.githubusercontent.com/u/35096584?v=4&s=117" width="117">](https://github.com/delpinux) -[<img alt="dkopecek" src="https://avatars2.githubusercontent.com/u/1353140?v=4&s=117" width="117">](https://github.com/dkopecek) -[<img alt="irrequietus" src="https://avatars0.githubusercontent.com/u/231192?v=4&s=117" width="117">](https://github.com/irrequietus) -[<img alt="jedelbo" src="https://avatars2.githubusercontent.com/u/572755?v=4&s=117" width="117">](https://github.com/jedelbo) -[<img alt="joelfrederico" src="https://avatars0.githubusercontent.com/u/458871?v=4&s=117" width="117">](https://github.com/joelfrederico) -[<img alt="jovermann" src="https://avatars3.githubusercontent.com/u/6087443?v=4&s=117" width="117">](https://github.com/jovermann) -[<img alt="kneth" src="https://avatars0.githubusercontent.com/u/1225363?v=4&s=117" width="117">](https://github.com/kneth) -[<img alt="kuzmas" src="https://avatars1.githubusercontent.com/u/1858553?v=4&s=117" width="117">](https://github.com/kuzmas) -[<img alt="lambdafu" src="https://avatars1.githubusercontent.com/u/1138455?v=4&s=117" width="117">](https://github.com/lambdafu) -[<img alt="lichray" src="https://avatars2.githubusercontent.com/u/433009?v=4&s=117" width="117">](https://github.com/lichray) -[<img alt="michael-brade" src="https://avatars0.githubusercontent.com/u/8768950?v=4&s=117" width="117">](https://github.com/michael-brade) -[<img alt="mkrupcale" src="https://avatars1.githubusercontent.com/u/13936020?v=4&s=117" width="117">](https://github.com/mkrupcale) -[<img alt="NewProggie" src="https://avatars3.githubusercontent.com/u/162319?s=460&v=4?v=4&s=117" width="117">](https://github.com/NewProggie) -[<img alt="pauloscustodio" src="https://avatars1.githubusercontent.com/u/70773?v=4&s=117" width="117">](https://github.com/pauloscustodio) -[<img alt="pleroux0" src="https://avatars2.githubusercontent.com/u/39619854?v=4&s=117" width="117">](https://github.com/pleroux0) -[<img alt="quadfault" src="https://avatars3.githubusercontent.com/u/30195320?v=4&s=117" width="117">](https://github.com/quadfault) -[<img alt="samhocevar" src="https://avatars2.githubusercontent.com/u/245089?v=4&s=117" width="117">](https://github.com/samhocevar) -[<img alt="sanssecours" src="https://avatars2.githubusercontent.com/u/691989?v=4&s=117" width="117">](https://github.com/sanssecours) -[<img alt="sgbeal" src="https://avatars1.githubusercontent.com/u/235303?v=4&s=117" width="117">](https://github.com/sgbeal) -[<img alt="studoot" src="https://avatars1.githubusercontent.com/u/799344?v=4&s=117" width="117">](https://github.com/studoot) -[<img alt="SvenJo" src="https://avatars1.githubusercontent.com/u/1538181?s=460&v=4?v=4&s=117" width="117">](https://github.com/SvenJo) -[<img alt="wickedmic" src="https://avatars1.githubusercontent.com/u/12001183?v=4&s=117" width="117">](https://github.com/wickedmic) -[<img alt="zhihaoy" src="https://avatars2.githubusercontent.com/u/43971430?v=4&s=117" width="117">](https://github.com/zhihaoy) - -## The Art of C++ - -Members of the *Art of C++* project. - -[<img alt="ColinH" src="https://avatars0.githubusercontent.com/u/113184?v=4&s=117" width="117">](https://github.com/ColinH) -[<img alt="d-frey" src="https://avatars2.githubusercontent.com/u/3956325?v=4&s=117" width="117">](https://github.com/d-frey) -[<img alt="uilianries" src="https://avatars0.githubusercontent.com/u/4870173?v=4&s=117" width="117">](https://github.com/uilianries) - -Copyright (c) 2019 Dr. Colin Hirsch and Daniel Frey diff --git a/packages/PEGTL/include/tao/pegtl.hpp b/packages/PEGTL/include/tao/pegtl.hpp index 42141a9df..832fc9eae 100644 --- a/packages/PEGTL/include/tao/pegtl.hpp +++ b/packages/PEGTL/include/tao/pegtl.hpp @@ -22,12 +22,15 @@ #include "pegtl/argv_input.hpp" #include "pegtl/buffer_input.hpp" #include "pegtl/cstream_input.hpp" -#include "pegtl/file_input.hpp" #include "pegtl/istream_input.hpp" #include "pegtl/memory_input.hpp" #include "pegtl/read_input.hpp" #include "pegtl/string_input.hpp" +// this has to be included *after* the above inputs, +// otherwise the amalgamated header will not work! +#include "pegtl/file_input.hpp" + #include "pegtl/change_action.hpp" #include "pegtl/change_action_and_state.hpp" #include "pegtl/change_action_and_states.hpp" diff --git a/packages/PEGTL/include/tao/pegtl/contrib/integer.hpp b/packages/PEGTL/include/tao/pegtl/contrib/integer.hpp index 77d11421b..2e9c8edb1 100644 --- a/packages/PEGTL/include/tao/pegtl/contrib/integer.hpp +++ b/packages/PEGTL/include/tao/pegtl/contrib/integer.hpp @@ -1,13 +1,16 @@ -// Copyright (c) 2018-2019 Dr. Colin Hirsch and Daniel Frey +// Copyright (c) 2019 Dr. Colin Hirsch and Daniel Frey // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ #ifndef TAO_PEGTL_CONTRIB_INTEGER_HPP #define TAO_PEGTL_CONTRIB_INTEGER_HPP -#include <limits> +#include <cstdint> +#include <cstdlib> + #include <type_traits> #include "../ascii.hpp" +#include "../parse.hpp" #include "../parse_error.hpp" #include "../rules.hpp" @@ -15,63 +18,332 @@ namespace TAO_PEGTL_NAMESPACE::integer { namespace internal { - template< typename I, I Limit, typename Input > - [[nodiscard]] I actual_convert( const Input& in, std::size_t index ) + struct unsigned_rule_old + : plus< digit > + { + // Pre-3.0 version of this rule. + }; + + struct unsigned_rule_new + : if_then_else< one< '0' >, not_at< digit >, plus< digit > > + { + // New version that does not allow leading zeros. + }; + + struct signed_rule_old + : seq< opt< one< '-', '+' > >, plus< digit > > + { + // Pre-3.0 version of this rule. + }; + + struct signed_rule_new + : seq< opt< one< '-', '+' > >, if_then_else< one< '0' >, not_at< digit >, plus< digit > > > + { + // New version that does not allow leading zeros. + }; + + struct signed_rule_bis + : seq< opt< one< '-' > >, if_then_else< one< '0' >, not_at< digit >, plus< digit > > > { - static constexpr I cutoff = Limit / 10; - static constexpr I cutlim = Limit % 10; + }; + + struct signed_rule_ter + : seq< one< '-', '+' >, if_then_else< one< '0' >, not_at< digit >, plus< digit > > > + { + }; + + [[nodiscard]] constexpr bool is_digit( const char c ) noexcept + { + // We don't use std::isdigit() because it might + // return true for other values on MS platforms. + + return ( '0' <= c ) && ( c <= '9' ); + } + + template< typename Integer, Integer Maximum = ( std::numeric_limits< Integer >::max )() > + [[nodiscard]] constexpr bool accumulate_digit( Integer& result, const char digit ) noexcept + { + // Assumes that digit is a digit as per is_digit(); returns false on overflow. + + static_assert( std::is_integral_v< Integer > ); - I out = in.peek_char( index ) - '0'; - while( ++index < in.size() ) { - const I c = in.peek_char( index ) - '0'; - if( ( out > cutoff ) || ( ( out == cutoff ) && ( c > cutlim ) ) ) { - throw parse_error( "integer out of range", in ); + constexpr Integer cutoff = Maximum / 10; + constexpr Integer cutlim = Maximum % 10; + + const Integer c = digit - '0'; + + if( ( result > cutoff ) || ( ( result == cutoff ) && ( c > cutlim ) ) ) { + return false; + } + result *= 10; + result += c; + return true; + } + + template< typename Integer, Integer Maximum = ( std::numeric_limits< Integer >::max )() > + [[nodiscard]] constexpr bool accumulate_digits( Integer& result, const std::string_view input ) noexcept + { + // Assumes input is a non-empty sequence of digits; returns false on overflow. + + for( std::size_t i = 0; i < input.size(); ++i ) { + if( !accumulate_digit< Integer, Maximum >( result, input[ i ] ) ) { + return false; } - out *= 10; - out += c; } - return out; + return true; } - template< typename I, typename Input > - [[nodiscard]] I convert_positive( const Input& in, std::size_t index ) + template< typename Integer, Integer Maximum = ( std::numeric_limits< Integer >::max )() > + [[nodiscard]] constexpr bool convert_positive( Integer& result, const std::string_view input ) noexcept { - static constexpr I limit = ( std::numeric_limits< I >::max )(); - return actual_convert< I, limit >( in, index ); + // Assumes result == 0 and that input is a non-empty sequence of digits; returns false on overflow. + + static_assert( std::is_integral_v< Integer > ); + return accumulate_digits< Integer, Maximum >( result, input ); } - template< typename I, typename Input > - [[nodiscard]] I convert_negative( const Input& in, std::size_t index ) + template< typename Signed > + [[nodiscard]] constexpr bool convert_negative( Signed& result, const std::string_view input ) noexcept { - using U = std::make_unsigned_t< I >; - static constexpr U limit = static_cast< U >( ( std::numeric_limits< I >::max )() ) + 1; - return static_cast< I >( ~actual_convert< U, limit >( in, index ) ) + 1; + // Assumes result == 0 and that input is a non-empty sequence of digits; returns false on overflow. + + static_assert( std::is_signed_v< Signed > ); + using Unsigned = std::make_unsigned_t< Signed >; + constexpr Unsigned maximum = static_cast< Unsigned >( ( std::numeric_limits< Signed >::max )() ) + 1; + Unsigned temporary = 0; + if( accumulate_digits< Unsigned, maximum >( temporary, input ) ) { + result = static_cast< Signed >( ~temporary ) + 1; + return true; + } + return false; + } + + template< typename Unsigned, Unsigned Maximum = ( std::numeric_limits< Unsigned >::max )() > + [[nodiscard]] constexpr bool convert_unsigned( Unsigned& result, const std::string_view input ) noexcept + { + // Assumes result == 0 and that input is a non-empty sequence of digits; returns false on overflow. + + static_assert( std::is_unsigned_v< Unsigned > ); + return accumulate_digits< Unsigned, Maximum >( result, input ); + } + + template< typename Signed > + [[nodiscard]] constexpr bool convert_signed( Signed& result, const std::string_view input ) noexcept + { + // Assumes result == 0 and that input is an optional sign followed by a non-empty sequence of digits; returns false on overflow. + + static_assert( std::is_signed_v< Signed > ); + if( input[ 0 ] == '-' ) { + return convert_negative< Signed >( result, std::string_view( input.data() + 1, input.size() - 1 ) ); + } + const auto offset = unsigned( input[ 0 ] == '+' ); + return convert_positive< Signed >( result, std::string_view( input.data() + offset, input.size() - offset ) ); + } + + template< typename Input > + [[nodiscard]] bool match_unsigned( Input& in ) noexcept( noexcept( in.empty() ) ) + { + if( !in.empty() ) { + const char c = in.peek_char(); + if( is_digit( c ) ) { + in.bump_in_this_line(); + if( c == '0' ) { + return in.empty() || ( !is_digit( in.peek_char() ) ); // TODO: Throw exception on digit? + } + while( ( !in.empty() ) && is_digit( in.peek_char() ) ) { + in.bump_in_this_line(); + } + return true; + } + } + return false; + } + + template< typename Input, + typename Unsigned, + Unsigned Maximum = ( std::numeric_limits< Unsigned >::max )() > + [[nodiscard]] bool match_and_convert_unsigned_with_maximum( Input& in, Unsigned& st ) + { + // Assumes st == 0. + + if( !in.empty() ) { + char c = in.peek_char(); + if( is_digit( c ) ) { + if( c == '0' ) { + in.bump_in_this_line(); + return in.empty() || ( !is_digit( in.peek_char() ) ); // TODO: Throw exception on digit? + } + do { + if( !accumulate_digit< Unsigned, Maximum >( st, c ) ) { + throw parse_error( "integer overflow", in ); // Consistent with "as if" an action was doing the conversion. + } + in.bump_in_this_line(); + } while( ( !in.empty() ) && is_digit( c = in.peek_char() ) ); + return true; + } + } + return false; } } // namespace internal + struct unsigned_action + { + // Assumes that 'in' contains a non-empty sequence of ASCII digits. + + template< typename Input, typename Unsigned > + static auto apply( const Input& in, Unsigned& st ) -> std::enable_if_t< std::is_unsigned_v< Unsigned >, void > + { + st = 0; // This function "only" offers basic exception safety. + if( !internal::convert_unsigned( st, in.string_view() ) ) { + throw parse_error( "unsigned integer overflow", in ); + } + } + + template< typename Input, typename State > + static auto apply( const Input& in, State& st ) -> std::enable_if_t< std::is_class_v< State >, void > + { + apply( in, st.converted ); // Compatibility for pre-3.0 behaviour. + } + + template< typename Input, typename Unsigned, typename... Ts > + static auto apply( const Input& in, std::vector< Unsigned, Ts... >& st ) -> std::enable_if_t< std::is_unsigned_v< Unsigned >, void > + { + Unsigned u = 0; + apply( in, u ); + st.emplace_back( u ); + } + }; + struct unsigned_rule - : plus< digit > { + using analyze_t = internal::unsigned_rule_new::analyze_t; + + template< typename Input > + [[nodiscard]] static bool match( Input& in ) noexcept( noexcept( in.empty() ) ) + { + return internal::match_unsigned( in ); // Does not check for any overflow. + } }; - struct unsigned_action + struct unsigned_rule_with_action + { + using analyze_t = internal::unsigned_rule_new::analyze_t; + + template< apply_mode A, + rewind_mode M, + template< typename... > + class Action, + template< typename... > + class Control, + typename Input, + typename... States > + [[nodiscard]] static auto match( Input& in, States&&... /*unused*/ ) noexcept( noexcept( in.empty() ) ) -> std::enable_if_t< A == apply_mode::nothing, bool > + { + return internal::match_unsigned( in ); // Does not check for any overflow. + } + + template< apply_mode A, + rewind_mode M, + template< typename... > + class Action, + template< typename... > + class Control, + typename Input, + typename Unsigned > + [[nodiscard]] static auto match( Input& in, Unsigned& st ) -> std::enable_if_t< ( A == apply_mode::action ) && std::is_unsigned_v< Unsigned >, bool > + { + st = 0; // This function "only" offers basic exception safety. + return internal::match_and_convert_unsigned_with_maximum( in, st ); // Throws on overflow. + } + + // TODO: Overload for st.converted? + // TODO: Overload for std::vector< Unsigned >? + }; + + template< typename Unsigned, Unsigned Maximum > + struct maximum_action { // Assumes that 'in' contains a non-empty sequence of ASCII digits. + static_assert( std::is_unsigned_v< Unsigned > ); + + template< typename Input, typename Unsigned2 > + static auto apply( const Input& in, Unsigned2& st ) -> std::enable_if_t< std::is_same_v< Unsigned, Unsigned2 >, void > + { + st = 0; // This function "only" offers basic exception safety. + if( !internal::convert_unsigned< Unsigned, Maximum >( st, in.string_view() ) ) { + throw parse_error( "unsigned integer overflow", in ); + } + } + template< typename Input, typename State > - static void apply( const Input& in, State& st ) + static auto apply( const Input& in, State& st ) -> std::enable_if_t< std::is_class_v< State >, void > + { + apply( in, st.converted ); // Compatibility for pre-3.0 behaviour. + } + + template< typename Input, typename Unsigned2, typename... Ts > + static auto apply( const Input& in, std::vector< Unsigned2, Ts... >& st ) -> std::enable_if_t< std::is_same_v< Unsigned, Unsigned2 >, void > { - using T = std::decay_t< decltype( st.converted ) >; - static_assert( std::is_integral_v< T > ); - static_assert( std::is_unsigned_v< T > ); - st.converted = internal::convert_positive< T >( in, 0 ); + Unsigned u = 0; + apply( in, u ); + st.emplace_back( u ); } }; - struct signed_rule - : seq< opt< one< '+', '-' > >, plus< digit > > + template< typename Unsigned, Unsigned Maximum = ( std::numeric_limits< Unsigned >::max )() > + struct maximum_rule { + static_assert( std::is_unsigned_v< Unsigned > ); + + using analyze_t = internal::unsigned_rule_new::analyze_t; + + template< typename Input > + [[nodiscard]] static bool match( Input& in ) + { + Unsigned st = 0; + return internal::match_and_convert_unsigned_with_maximum< Input, Unsigned, Maximum >( in, st ); // Throws on overflow. + } + }; + + template< typename Unsigned, Unsigned Maximum = ( std::numeric_limits< Unsigned >::max )() > + struct maximum_rule_with_action + { + static_assert( std::is_unsigned_v< Unsigned > ); + + using analyze_t = internal::unsigned_rule_new::analyze_t; + + template< apply_mode A, + rewind_mode M, + template< typename... > + class Action, + template< typename... > + class Control, + typename Input, + typename... States > + [[nodiscard]] static auto match( Input& in, States&&... /*unused*/ ) -> std::enable_if_t< A == apply_mode::nothing, bool > + { + Unsigned st = 0; + return internal::match_and_convert_unsigned_with_maximum< Input, Unsigned, Maximum >( in, st ); // Throws on overflow. + } + + template< apply_mode A, + rewind_mode M, + template< typename... > + class Action, + template< typename... > + class Control, + typename Input, + typename Unsigned2 > + [[nodiscard]] static auto match( Input& in, Unsigned2& st ) -> std::enable_if_t< ( A == apply_mode::action ) && std::is_same_v< Unsigned, Unsigned2 >, bool > + { + st = 0; // This function "only" offers basic exception safety. + return internal::match_and_convert_unsigned_with_maximum< Input, Unsigned, Maximum >( in, st ); // Throws on overflow. + } + + // TODO: Overload for st.converted? + // TODO: Overload for std::vector< Unsigned >? }; struct signed_action @@ -79,20 +351,96 @@ namespace TAO_PEGTL_NAMESPACE::integer // Assumes that 'in' contains a non-empty sequence of ASCII digits, // with optional leading sign; with sign, in.size() must be >= 2. - template< typename Input, typename State > - static void apply( const Input& in, State& st ) - { - using T = std::decay_t< decltype( st.converted ) >; - static_assert( std::is_integral_v< T > ); - static_assert( std::is_signed_v< T > ); - const auto c = in.peek_char(); - if( c == '-' ) { - st.converted = internal::convert_negative< T >( in, 1 ); - } - else { - st.converted = internal::convert_positive< T >( in, std::size_t( c == '+' ) ); + template< typename Input, typename Signed > + static auto apply( const Input& in, Signed& st ) -> std::enable_if_t< std::is_signed_v< Signed >, void > + { + st = 0; // This function "only" offers basic exception safety. + if( !internal::convert_signed( st, in.string_view() ) ) { + throw parse_error( "signed integer overflow", in ); } } + + template< typename Input, typename State > + static auto apply( const Input& in, State& st ) -> std::enable_if_t< std::is_class_v< State >, void > + { + apply( in, st.converted ); // Compatibility for pre-3.0 behaviour. + } + + template< typename Input, typename Signed, typename... Ts > + static auto apply( const Input& in, std::vector< Signed, Ts... >& st ) -> std::enable_if_t< std::is_signed_v< Signed >, void > + { + Signed s = 0; + apply( in, s ); + st.emplace_back( s ); + } + }; + + struct signed_rule + { + using analyze_t = internal::signed_rule_new::analyze_t; + + template< apply_mode A, + rewind_mode M, + template< typename... > + class Action, + template< typename... > + class Control, + typename Input, + typename... States > + [[nodiscard]] static bool match( Input& in, States&&... /*unused*/ ) noexcept( noexcept( in.empty() ) ) + { + return TAO_PEGTL_NAMESPACE::parse< internal::signed_rule_new >( in ); // Does not check for any overflow. + } + }; + + namespace internal + { + template< typename Rule > + struct signed_action_action + : nothing< Rule > + { + }; + + template<> + struct signed_action_action< signed_rule_new > + : signed_action + { + }; + + } // namespace internal + + struct signed_rule_with_action + { + using analyze_t = internal::signed_rule_new::analyze_t; + + template< apply_mode A, + rewind_mode M, + template< typename... > + class Action, + template< typename... > + class Control, + typename Input, + typename... States > + [[nodiscard]] static auto match( Input& in, States&&... /*unused*/ ) noexcept( noexcept( in.empty() ) ) -> std::enable_if_t< A == apply_mode::nothing, bool > + { + return TAO_PEGTL_NAMESPACE::parse< internal::signed_rule_new >( in ); // Does not check for any overflow. + } + + template< apply_mode A, + rewind_mode M, + template< typename... > + class Action, + template< typename... > + class Control, + typename Input, + typename Signed > + [[nodiscard]] static auto match( Input& in, Signed& st ) -> std::enable_if_t< ( A == apply_mode::action ) && std::is_signed_v< Signed >, bool > + { + return TAO_PEGTL_NAMESPACE::parse< internal::signed_rule_new, internal::signed_action_action >( in, st ); // Throws on overflow. + } + + // TODO: Overload for st.converted? + // TODO: Overload for std::vector< Signed >? }; } // namespace TAO_PEGTL_NAMESPACE::integer diff --git a/packages/PEGTL/include/tao/pegtl/contrib/json.hpp b/packages/PEGTL/include/tao/pegtl/contrib/json.hpp index 76564b5ef..a105f0ef8 100644 --- a/packages/PEGTL/include/tao/pegtl/contrib/json.hpp +++ b/packages/PEGTL/include/tao/pegtl/contrib/json.hpp @@ -9,8 +9,6 @@ #include "../rules.hpp" #include "../utf8.hpp" -#include "abnf.hpp" - namespace TAO_PEGTL_NAMESPACE::json { // JSON grammar according to RFC 8259 @@ -32,13 +30,13 @@ namespace TAO_PEGTL_NAMESPACE::json struct null : string< 'n', 'u', 'l', 'l' > {}; struct true_ : string< 't', 'r', 'u', 'e' > {}; - struct digits : plus< abnf::DIGIT > {}; + struct digits : plus< digit > {}; struct exp : seq< one< 'e', 'E' >, opt< one< '-', '+'> >, must< digits > > {}; struct frac : if_must< one< '.' >, digits > {}; struct int_ : sor< one< '0' >, digits > {}; struct number : seq< opt< one< '-' > >, int_, opt< frac >, opt< exp > > {}; - struct xdigit : abnf::HEXDIG {}; + struct xdigit : pegtl::xdigit {}; struct unicode : list< seq< one< 'u' >, rep< 4, must< xdigit > > >, one< '\\' > > {}; struct escaped_char : one< '"', '\\', '/', 'b', 'f', 'n', 'r', 't' > {}; struct escaped : sor< escaped_char, unicode > {}; diff --git a/packages/PEGTL/include/tao/pegtl/contrib/json_pointer.hpp b/packages/PEGTL/include/tao/pegtl/contrib/json_pointer.hpp new file mode 100644 index 000000000..d03c8364e --- /dev/null +++ b/packages/PEGTL/include/tao/pegtl/contrib/json_pointer.hpp @@ -0,0 +1,33 @@ +// Copyright (c) 2019 Dr. Colin Hirsch and Daniel Frey +// Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ + +#ifndef TAO_PEGTL_CONTRIB_JSON_POINTER_HPP +#define TAO_PEGTL_CONTRIB_JSON_POINTER_HPP + +#include "../ascii.hpp" +#include "../config.hpp" +#include "../rules.hpp" +#include "../utf8.hpp" + +namespace TAO_PEGTL_NAMESPACE::json_pointer +{ + // JSON pointer grammar according to RFC 6901 + + // clang-format off + struct unescaped : utf8::ranges< 0x0, 0x2E, 0x30, 0x7D, 0x7F, 0x10FFFF > {}; + struct escaped : seq< one< '~' >, one< '0', '1' > > {}; + + struct reference_token : star< sor< unescaped, escaped > > {}; + struct json_pointer : star< one< '/' >, reference_token > {}; + // clang-format on + + // relative JSON pointer, see ... + + // clang-format off + struct non_negative_integer : sor< one< '0' >, plus< digit > > {}; + struct relative_json_pointer : seq< non_negative_integer, sor< one< '#' >, json_pointer > > {}; + // clang-format on + +} // namespace TAO_PEGTL_NAMESPACE::json_pointer + +#endif diff --git a/packages/PEGTL/include/tao/pegtl/contrib/uri.hpp b/packages/PEGTL/include/tao/pegtl/contrib/uri.hpp index 06f5e7cf8..2a391bd69 100644 --- a/packages/PEGTL/include/tao/pegtl/contrib/uri.hpp +++ b/packages/PEGTL/include/tao/pegtl/contrib/uri.hpp @@ -4,12 +4,15 @@ #ifndef TAO_PEGTL_CONTRIB_URI_HPP #define TAO_PEGTL_CONTRIB_URI_HPP +#include <cstdint> + #include "../ascii.hpp" #include "../config.hpp" #include "../rules.hpp" #include "../utf8.hpp" #include "abnf.hpp" +#include "integer.hpp" namespace TAO_PEGTL_NAMESPACE::uri { @@ -25,11 +28,7 @@ namespace TAO_PEGTL_NAMESPACE::uri using colon = one< ':' >; // clang-format off - struct dec_octet : sor< one< '0' >, - rep_min_max< 1, 2, abnf::DIGIT >, - seq< one< '1' >, abnf::DIGIT, abnf::DIGIT >, - seq< one< '2' >, range< '0', '4' >, abnf::DIGIT >, - seq< string< '2', '5' >, range< '0', '5' > > > {}; + struct dec_octet : integer::maximum_rule< std::uint8_t > {}; struct IPv4address : seq< dec_octet, dot, dec_octet, dot, dec_octet, dot, dec_octet > {}; diff --git a/packages/PEGTL/src/test/pegtl/ascii_forty_two.cpp b/packages/PEGTL/src/test/pegtl/ascii_forty_two.cpp index 4e79fdd9d..e1224b2d6 100644 --- a/packages/PEGTL/src/test/pegtl/ascii_forty_two.cpp +++ b/packages/PEGTL/src/test/pegtl/ascii_forty_two.cpp @@ -16,19 +16,19 @@ namespace TAO_PEGTL_NAMESPACE verify_rule< forty_two< 'a' > >( __LINE__, __FILE__, std::string( i, 'a' ), result_type::local_failure ); } for( std::size_t i = 42; i < 100; ++i ) { - verify_rule< forty_two< 'a' > >( __LINE__, __FILE__, std::string( i, 'a' ), result_type::success, i - 42 ); + verify_rule< forty_two< 'a' > >( __LINE__, __FILE__, std::string( i, 'a' ), result_type::success, int( i - 42 ) ); } for( std::size_t i = 0; i < 42; ++i ) { verify_rule< forty_two< 'a', 'z' > >( __LINE__, __FILE__, std::string( i, 'a' ), result_type::local_failure ); } for( std::size_t i = 42; i < 100; ++i ) { - verify_rule< forty_two< 'a', 'z' > >( __LINE__, __FILE__, std::string( i, 'a' ), result_type::success, i - 42 ); + verify_rule< forty_two< 'a', 'z' > >( __LINE__, __FILE__, std::string( i, 'a' ), result_type::success, int( i - 42 ) ); } for( std::size_t i = 0; i < 42; ++i ) { verify_rule< forty_two< 'a', 'z' > >( __LINE__, __FILE__, std::string( i, 'z' ), result_type::local_failure ); } for( std::size_t i = 42; i < 100; ++i ) { - verify_rule< forty_two< 'a', 'z' > >( __LINE__, __FILE__, std::string( i, 'z' ), result_type::success, i - 42 ); + verify_rule< forty_two< 'a', 'z' > >( __LINE__, __FILE__, std::string( i, 'z' ), result_type::success, int( i - 42 ) ); } verify_rule< forty_two< 'a', 'z' > >( __LINE__, __FILE__, "azzaazaazaaazzzaaaazzaaazzaazazzzaazzazaza", result_type::success ); } diff --git a/packages/PEGTL/src/test/pegtl/contrib_integer.cpp b/packages/PEGTL/src/test/pegtl/contrib_integer.cpp index a6f3d9a52..e819cdc6d 100644 --- a/packages/PEGTL/src/test/pegtl/contrib_integer.cpp +++ b/packages/PEGTL/src/test/pegtl/contrib_integer.cpp @@ -6,6 +6,8 @@ #include "test.hpp" +#include "verify_rule.hpp" + #include <tao/pegtl/contrib/integer.hpp> namespace TAO_PEGTL_NAMESPACE @@ -18,6 +20,7 @@ namespace TAO_PEGTL_NAMESPACE template< typename Rule > struct int_action + : nothing< Rule > {}; template<> @@ -33,10 +36,24 @@ namespace TAO_PEGTL_NAMESPACE template< typename S > void test_signed( const std::string& i, const S s ) { - int_state< S > st; - memory_input in( i, __FUNCTION__ ); - parse< must< integer::signed_rule, eof >, int_action >( in, st ); - TAO_PEGTL_TEST_ASSERT( st.converted == s ); + { + S st = -123; + memory_input in( i, __FUNCTION__ ); + parse< must< integer::signed_rule, eof >, int_action >( in, st ); + TAO_PEGTL_TEST_ASSERT( st == s ); + } + { + int_state< S > st; + memory_input in( i, __FUNCTION__ ); + parse< must< integer::signed_rule, eof >, int_action >( in, st ); + TAO_PEGTL_TEST_ASSERT( st.converted == s ); + } + { + S st = -123; + memory_input in( i, __FUNCTION__ ); + parse< must< integer::signed_rule_with_action, eof > >( in, st ); + TAO_PEGTL_TEST_ASSERT( st == s ); + } } template< typename S > @@ -68,16 +85,30 @@ namespace TAO_PEGTL_NAMESPACE template< typename S > void test_unsigned( const std::string& i, const S s ) { - int_state< S > st; - memory_input in( i, __FUNCTION__ ); - parse< must< integer::unsigned_rule, eof >, int_action >( in, st ); - TAO_PEGTL_TEST_ASSERT( st.converted == s ); + { + S st = 123; + memory_input in( i, __FUNCTION__ ); + parse< must< integer::unsigned_rule, eof >, int_action >( in, st ); + TAO_PEGTL_TEST_ASSERT( st == s ); + } + { + int_state< S > st; + memory_input in( i, __FUNCTION__ ); + parse< must< integer::unsigned_rule, eof >, int_action >( in, st ); + TAO_PEGTL_TEST_ASSERT( st.converted == s ); + } + { + S st = 123; + memory_input in( i, __FUNCTION__ ); + parse< must< integer::unsigned_rule_with_action, eof > >( in, st ); + TAO_PEGTL_TEST_ASSERT( st == s ); + } } template< typename S > void test_unsigned( const std::string& i ) { - int_state< S > st; + S st = 123; memory_input in( i, __FUNCTION__ ); TAO_PEGTL_TEST_THROWS( parse< must< integer::unsigned_rule, eof >, int_action >( in, st ) ); } @@ -85,15 +116,22 @@ namespace TAO_PEGTL_NAMESPACE template< typename S > void test_unsigned( const S s ) { - int_state< S > st; + S st = 123; const auto i = lexical_cast( s ); memory_input in( i, __FUNCTION__ ); parse< must< integer::unsigned_rule, eof >, int_action >( in, st ); - TAO_PEGTL_TEST_ASSERT( st.converted == s ); + TAO_PEGTL_TEST_ASSERT( st == s ); } + template< auto M > using max_seq_rule = seq< one< 'a' >, integer::maximum_rule< std::uint64_t, M >, one< 'b' >, eof >; + void unit_test() { + test_signed< signed char >( "" ); + test_signed< signed char >( "-" ); + test_signed< signed char >( "+" ); + test_signed< signed char >( "a" ); + test_signed< signed char >( "--0" ); test_signed< signed char >( "++0" ); test_signed< signed char >( "-+0" ); @@ -101,32 +139,44 @@ namespace TAO_PEGTL_NAMESPACE test_signed< signed char >( "0", 0 ); test_signed< signed char >( "+0", 0 ); test_signed< signed char >( "-0", 0 ); - test_signed< signed char >( "000", 0 ); - test_signed< signed char >( "+000", 0 ); - test_signed< signed char >( "-000", 0 ); + test_signed< signed char >( "000" ); + + test_signed< signed char >( "+000" ); + test_signed< signed char >( "-000" ); test_signed< signed char >( "127", 127 ); + test_signed< signed char >( "0127" ); test_signed< signed char >( "-1", -1 ); - test_signed< signed char >( "-001", -1 ); + test_signed< signed char >( "-01" ); + test_signed< signed char >( "-001" ); test_signed< signed char >( "-127", -127 ); test_signed< signed char >( "-128", -128 ); test_signed< signed char >( "128" ); test_signed< signed char >( "-129" ); + test_signed< signed char >( "0128" ); test_signed< signed char >( "00128" ); + test_signed< signed char >( "-0129" ); test_signed< signed char >( "-00129" ); + test_unsigned< unsigned char >( "" ); + test_unsigned< unsigned char >( "-" ); + test_unsigned< unsigned char >( "+" ); + test_unsigned< unsigned char >( "a" ); + test_unsigned< unsigned char >( "-0" ); test_unsigned< unsigned char >( "+1" ); test_unsigned< unsigned char >( "0", 0 ); - test_unsigned< unsigned char >( "000", 0 ); + test_unsigned< unsigned char >( "000" ); test_unsigned< unsigned char >( "0", 0 ); test_unsigned< unsigned char >( "255", 255 ); - test_unsigned< unsigned char >( "000255", 255 ); + test_unsigned< unsigned char >( "0255" ); + test_unsigned< unsigned char >( "000255" ); test_unsigned< unsigned char >( "256" ); + test_unsigned< unsigned char >( "0256" ); test_unsigned< unsigned char >( "000256" ); test_signed< signed long long >( "0", 0 ); @@ -135,6 +185,76 @@ namespace TAO_PEGTL_NAMESPACE test_unsigned< unsigned long long >( "0", 0 ); test_unsigned< unsigned long long >( ( std::numeric_limits< unsigned long long >::max )() ); + + verify_rule< max_seq_rule< 0 > >( __LINE__, __FILE__, "a0b", result_type::success ); + verify_rule< max_seq_rule< 0 > >( __LINE__, __FILE__, "ab", result_type::local_failure ); + verify_rule< max_seq_rule< 0 > >( __LINE__, __FILE__, "a1b", result_type::global_failure ); + verify_rule< max_seq_rule< 0 > >( __LINE__, __FILE__, "a9b", result_type::global_failure ); + verify_rule< max_seq_rule< 0 > >( __LINE__, __FILE__, "a11b", result_type::global_failure ); + + verify_rule< max_seq_rule< 1 > >( __LINE__, __FILE__, "a0b", result_type::success ); + verify_rule< max_seq_rule< 1 > >( __LINE__, __FILE__, "a1b", result_type::success ); + verify_rule< max_seq_rule< 1 > >( __LINE__, __FILE__, "ab", result_type::local_failure ); + verify_rule< max_seq_rule< 1 > >( __LINE__, __FILE__, "a2b", result_type::global_failure ); + verify_rule< max_seq_rule< 1 > >( __LINE__, __FILE__, "a9b", result_type::global_failure ); + verify_rule< max_seq_rule< 1 > >( __LINE__, __FILE__, "a11b", result_type::global_failure ); + + verify_rule< max_seq_rule< 2 > >( __LINE__, __FILE__, "a0b", result_type::success ); + verify_rule< max_seq_rule< 2 > >( __LINE__, __FILE__, "a1b", result_type::success ); + verify_rule< max_seq_rule< 2 > >( __LINE__, __FILE__, "a2b", result_type::success ); + verify_rule< max_seq_rule< 2 > >( __LINE__, __FILE__, "ab", result_type::local_failure ); + verify_rule< max_seq_rule< 2 > >( __LINE__, __FILE__, "a3b", result_type::global_failure ); + verify_rule< max_seq_rule< 2 > >( __LINE__, __FILE__, "a9b", result_type::global_failure ); + verify_rule< max_seq_rule< 2 > >( __LINE__, __FILE__, "a11b", result_type::global_failure ); + + verify_rule< max_seq_rule< 3 > >( __LINE__, __FILE__, "a0b", result_type::success ); + verify_rule< max_seq_rule< 3 > >( __LINE__, __FILE__, "a3b", result_type::success ); + verify_rule< max_seq_rule< 3 > >( __LINE__, __FILE__, "ab", result_type::local_failure ); + verify_rule< max_seq_rule< 3 > >( __LINE__, __FILE__, "a4b", result_type::global_failure ); + verify_rule< max_seq_rule< 3 > >( __LINE__, __FILE__, "a11b", result_type::global_failure ); + + verify_rule< max_seq_rule< 4 > >( __LINE__, __FILE__, "a5b", result_type::global_failure ); + verify_rule< max_seq_rule< 4 > >( __LINE__, __FILE__, "a11b", result_type::global_failure ); + + verify_rule< max_seq_rule< 9 > >( __LINE__, __FILE__, "a0b", result_type::success ); + verify_rule< max_seq_rule< 9 > >( __LINE__, __FILE__, "a9b", result_type::success ); + verify_rule< max_seq_rule< 9 > >( __LINE__, __FILE__, "ab", result_type::local_failure ); + verify_rule< max_seq_rule< 9 > >( __LINE__, __FILE__, "a10b", result_type::global_failure ); + verify_rule< max_seq_rule< 9 > >( __LINE__, __FILE__, "a11b", result_type::global_failure ); + + verify_rule< max_seq_rule< 10 > >( __LINE__, __FILE__, "a0b", result_type::success ); + verify_rule< max_seq_rule< 10 > >( __LINE__, __FILE__, "a9b", result_type::success ); + verify_rule< max_seq_rule< 10 > >( __LINE__, __FILE__, "a10b", result_type::success ); + verify_rule< max_seq_rule< 10 > >( __LINE__, __FILE__, "ab", result_type::local_failure ); + verify_rule< max_seq_rule< 10 > >( __LINE__, __FILE__, "a11b", result_type::global_failure ); + verify_rule< max_seq_rule< 10 > >( __LINE__, __FILE__, "a19b", result_type::global_failure ); + + verify_rule< max_seq_rule< 11 > >( __LINE__, __FILE__, "a0b", result_type::success ); + verify_rule< max_seq_rule< 11 > >( __LINE__, __FILE__, "a9b", result_type::success ); + verify_rule< max_seq_rule< 11 > >( __LINE__, __FILE__, "a10b", result_type::success ); + verify_rule< max_seq_rule< 11 > >( __LINE__, __FILE__, "a11b", result_type::success ); + verify_rule< max_seq_rule< 11 > >( __LINE__, __FILE__, "ab", result_type::local_failure ); + verify_rule< max_seq_rule< 11 > >( __LINE__, __FILE__, "a12b", result_type::global_failure ); + verify_rule< max_seq_rule< 11 > >( __LINE__, __FILE__, "a13b", result_type::global_failure ); + verify_rule< max_seq_rule< 11 > >( __LINE__, __FILE__, "a111b", result_type::global_failure ); + + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a0b", result_type::success ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a1b", result_type::success ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a9b", result_type::success ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a10b", result_type::success ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a11b", result_type::success ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a12b", result_type::success ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "ab", result_type::local_failure ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a13b", result_type::global_failure ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a19b", result_type::global_failure ); + verify_rule< max_seq_rule< 12 > >( __LINE__, __FILE__, "a111b", result_type::global_failure ); + + verify_rule< max_seq_rule< 18446744073709551614ULL > >( __LINE__, __FILE__, "a18446744073709551614b", result_type::success ); + verify_rule< max_seq_rule< 18446744073709551614ULL > >( __LINE__, __FILE__, "a18446744073709551615b", result_type::global_failure ); + + verify_rule< max_seq_rule< 18446744073709551615ULL > >( __LINE__, __FILE__, "a18446744073709551615b", result_type::success ); + verify_rule< max_seq_rule< 18446744073709551615ULL > >( __LINE__, __FILE__, "a18446744073709551616b", result_type::global_failure ); + verify_rule< max_seq_rule< 18446744073709551615ULL > >( __LINE__, __FILE__, "a98446744073709551614b", result_type::global_failure ); } } // namespace TAO_PEGTL_NAMESPACE diff --git a/packages/PEGTL/src/test/pegtl/rule_rematch.cpp b/packages/PEGTL/src/test/pegtl/rule_rematch.cpp index d6d384469..0cc22500f 100644 --- a/packages/PEGTL/src/test/pegtl/rule_rematch.cpp +++ b/packages/PEGTL/src/test/pegtl/rule_rematch.cpp @@ -9,11 +9,11 @@ namespace TAO_PEGTL_NAMESPACE { void unit_test() { - verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "c", result_type::success, 0 ); - verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "a", result_type::local_failure, 1 ); - verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "b", result_type::local_failure, 1 ); + verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "c", result_type::success ); + verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "a", result_type::local_failure ); + verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "b", result_type::local_failure ); verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "cc", result_type::success, 1 ); - verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "bc", result_type::local_failure, 2 ); + verify_rule< rematch< one< 'c' > > >( __LINE__, __FILE__, "bc", result_type::local_failure ); verify_analyze< rematch< alpha, digit > >( __LINE__, __FILE__, true, false ); verify_analyze< rematch< opt< alpha >, digit > >( __LINE__, __FILE__, false, false ); @@ -45,12 +45,12 @@ namespace TAO_PEGTL_NAMESPACE verify_rule< rematch< alnum, success, digit > >( __LINE__, __FILE__, "12", result_type::success, 1 ); verify_rule< rematch< alnum, success, digit > >( __LINE__, __FILE__, "1c", result_type::success, 1 ); - verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "", result_type::local_failure, 0 ); - verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "1", result_type::success, 0 ); - verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "a", result_type::local_failure, 1 ); - verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "%", result_type::local_failure, 1 ); + verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "", result_type::local_failure ); + verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "1", result_type::success ); + verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "a", result_type::local_failure ); + verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "%", result_type::local_failure ); verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "1%", result_type::success, 1 ); - verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "a%", result_type::local_failure, 1 ); + verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "a%", result_type::local_failure ); verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "12", result_type::success, 0 ); verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "1c", result_type::success, 0 ); verify_rule< rematch< plus< alnum >, digit > >( __LINE__, __FILE__, "aa", result_type::local_failure, 2 ); @@ -62,7 +62,7 @@ namespace TAO_PEGTL_NAMESPACE verify_rule< rematch< plus< alnum >, plus< digit > > >( __LINE__, __FILE__, "a", result_type::local_failure, 1 ); verify_rule< rematch< plus< alnum >, plus< digit > > >( __LINE__, __FILE__, "%", result_type::local_failure, 1 ); verify_rule< rematch< plus< alnum >, plus< digit > > >( __LINE__, __FILE__, "1%", result_type::success, 1 ); - verify_rule< rematch< plus< alnum >, plus< digit > > >( __LINE__, __FILE__, "a%", result_type::local_failure, 1 ); + verify_rule< rematch< plus< alnum >, plus< digit > > >( __LINE__, __FILE__, "a%", result_type::local_failure ); verify_rule< rematch< plus< alnum >, plus< digit > > >( __LINE__, __FILE__, "12", result_type::success, 0 ); verify_rule< rematch< plus< alnum >, plus< digit > > >( __LINE__, __FILE__, "1c", result_type::success, 0 ); verify_rule< rematch< plus< alnum >, plus< digit > > >( __LINE__, __FILE__, "aa", result_type::local_failure, 2 ); diff --git a/packages/PEGTL/src/test/pegtl/utf16_general.cpp b/packages/PEGTL/src/test/pegtl/utf16_general.cpp index 1a9521612..fd8407494 100644 --- a/packages/PEGTL/src/test/pegtl/utf16_general.cpp +++ b/packages/PEGTL/src/test/pegtl/utf16_general.cpp @@ -29,114 +29,114 @@ namespace TAO_PEGTL_NAMESPACE void test_utf16() { - verify_rule< utf16::any >( __LINE__, __FILE__, "", result_type::local_failure, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, "\x01", result_type::local_failure, 1 ); - verify_rule< utf16::any >( __LINE__, __FILE__, "\xff", result_type::local_failure, 1 ); - - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0 ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 1 ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, " ", result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0x00ff ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0x0100 ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0x0fff ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0x1000 ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ), result_type::local_failure, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd900 ), result_type::local_failure, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xde00 ), result_type::local_failure, 0 ); + verify_rule< utf16::any >( __LINE__, __FILE__, "", result_type::local_failure ); + verify_rule< utf16::any >( __LINE__, __FILE__, "\x01", result_type::local_failure ); + verify_rule< utf16::any >( __LINE__, __FILE__, "\xff", result_type::local_failure ); + + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0 ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 1 ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, " ", result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0x00ff ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0x0100 ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0x0fff ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0x1000 ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ), result_type::local_failure ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd900 ), result_type::local_failure ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xde00 ), result_type::local_failure ); verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xfffe ) + " ", result_type::success, 1 ); verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xffff ) + " ", result_type::success, 2 ); verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd7ff ) + u16s( 0xdfff ), result_type::success, 2 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xdc00 ) + u16s( 0xdfff ), result_type::local_failure, 4 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ) + u16s( 0x0020 ), result_type::local_failure, 4 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ) + u16s( 0xff20 ), result_type::local_failure, 4 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ) + u16s( 0xdf00 ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ) + u16s( 0xdfff ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xdbff ) + u16s( 0xdc00 ), result_type::success, 0 ); - verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xdbff ) + u16s( 0xdfff ), result_type::success, 0 ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xdc00 ) + u16s( 0xdfff ), result_type::local_failure ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ) + u16s( 0x0020 ), result_type::local_failure ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ) + u16s( 0xff20 ), result_type::local_failure ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ) + u16s( 0xdf00 ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xd800 ) + u16s( 0xdfff ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xdbff ) + u16s( 0xdc00 ), result_type::success ); + verify_rule< utf16::any >( __LINE__, __FILE__, u16s( 0xdbff ) + u16s( 0xdfff ), result_type::success ); - verify_rule< utf16::one< 0x20 > >( __LINE__, __FILE__, u16s( 0x20 ), result_type::success, 0 ); - verify_rule< utf16::one< 0x20ac > >( __LINE__, __FILE__, u16s( 0x20ac ), result_type::success, 0 ); - verify_rule< utf16::one< 0x10437 > >( __LINE__, __FILE__, u16s( 0xd801 ) + u16s( 0xdc37 ), result_type::success, 0 ); + verify_rule< utf16::one< 0x20 > >( __LINE__, __FILE__, u16s( 0x20 ), result_type::success ); + verify_rule< utf16::one< 0x20ac > >( __LINE__, __FILE__, u16s( 0x20ac ), result_type::success ); + verify_rule< utf16::one< 0x10437 > >( __LINE__, __FILE__, u16s( 0xd801 ) + u16s( 0xdc37 ), result_type::success ); - verify_rule< utf16::bom >( __LINE__, __FILE__, u16s( 0xfeff ), result_type::success, 0 ); - verify_rule< utf16::bom >( __LINE__, __FILE__, u16s( 0xfffe ), result_type::local_failure, 2 ); + verify_rule< utf16::bom >( __LINE__, __FILE__, u16s( 0xfeff ), result_type::success ); + verify_rule< utf16::bom >( __LINE__, __FILE__, u16s( 0xfffe ), result_type::local_failure ); verify_rule< utf16::string< 0x20, 0x20ac, 0x10437 > >( __LINE__, __FILE__, u16s( 0x20 ) + u16s( 0x20ac ) + u16s( 0xd801 ) + u16s( 0xdc37 ) + u16s( 0x20 ), result_type::success, 2 ); } void test_utf16_be() { - verify_rule< utf16_be::any >( __LINE__, __FILE__, "", result_type::local_failure, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, "\x01", result_type::local_failure, 1 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, "\xff", result_type::local_failure, 1 ); - - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0 ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 1 ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, " ", result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0x00ff ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0x0100 ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0x0fff ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0x1000 ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ), result_type::local_failure, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd900 ), result_type::local_failure, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xde00 ), result_type::local_failure, 0 ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, "", result_type::local_failure ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, "\x01", result_type::local_failure ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, "\xff", result_type::local_failure ); + + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0 ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 1 ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, " ", result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0x00ff ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0x0100 ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0x0fff ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0x1000 ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ), result_type::local_failure ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd900 ), result_type::local_failure ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xde00 ), result_type::local_failure ); verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xfffe ) + " ", result_type::success, 1 ); verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xffff ) + " ", result_type::success, 2 ); verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd7ff ) + u16s_be( 0xdfff ), result_type::success, 2 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xdc00 ) + u16s_be( 0xdfff ), result_type::local_failure, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ) + u16s_be( 0x0020 ), result_type::local_failure, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ) + u16s_be( 0xff20 ), result_type::local_failure, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ) + u16s_be( 0xdf00 ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ) + u16s_be( 0xdfff ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xdbff ) + u16s_be( 0xdc00 ), result_type::success, 0 ); - verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xdbff ) + u16s_be( 0xdfff ), result_type::success, 0 ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xdc00 ) + u16s_be( 0xdfff ), result_type::local_failure ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ) + u16s_be( 0x0020 ), result_type::local_failure ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ) + u16s_be( 0xff20 ), result_type::local_failure ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ) + u16s_be( 0xdf00 ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xd800 ) + u16s_be( 0xdfff ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xdbff ) + u16s_be( 0xdc00 ), result_type::success ); + verify_rule< utf16_be::any >( __LINE__, __FILE__, u16s_be( 0xdbff ) + u16s_be( 0xdfff ), result_type::success ); - verify_rule< utf16_be::one< 0x20 > >( __LINE__, __FILE__, u16s_be( 0x20 ), result_type::success, 0 ); - verify_rule< utf16_be::one< 0x20ac > >( __LINE__, __FILE__, u16s_be( 0x20ac ), result_type::success, 0 ); - verify_rule< utf16_be::one< 0x10437 > >( __LINE__, __FILE__, u16s_be( 0xd801 ) + u16s_be( 0xdc37 ), result_type::success, 0 ); + verify_rule< utf16_be::one< 0x20 > >( __LINE__, __FILE__, u16s_be( 0x20 ), result_type::success ); + verify_rule< utf16_be::one< 0x20ac > >( __LINE__, __FILE__, u16s_be( 0x20ac ), result_type::success ); + verify_rule< utf16_be::one< 0x10437 > >( __LINE__, __FILE__, u16s_be( 0xd801 ) + u16s_be( 0xdc37 ), result_type::success ); - verify_rule< utf16_be::bom >( __LINE__, __FILE__, u16s_be( 0xfeff ), result_type::success, 0 ); - verify_rule< utf16_be::bom >( __LINE__, __FILE__, u16s_be( 0xfffe ), result_type::local_failure, 2 ); + verify_rule< utf16_be::bom >( __LINE__, __FILE__, u16s_be( 0xfeff ), result_type::success ); + verify_rule< utf16_be::bom >( __LINE__, __FILE__, u16s_be( 0xfffe ), result_type::local_failure ); verify_rule< utf16_be::string< 0x20, 0x20ac, 0x10437 > >( __LINE__, __FILE__, u16s_be( 0x20 ) + u16s_be( 0x20ac ) + u16s_be( 0xd801 ) + u16s_be( 0xdc37 ) + u16s_be( 0x20 ), result_type::success, 2 ); } void test_utf16_le() { - verify_rule< utf16_le::any >( __LINE__, __FILE__, "", result_type::local_failure, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, "\x01", result_type::local_failure, 1 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, "\xff", result_type::local_failure, 1 ); - - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0 ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 1 ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, " ", result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0x00ff ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0x0100 ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0x0fff ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0x1000 ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ), result_type::local_failure, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd900 ), result_type::local_failure, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xde00 ), result_type::local_failure, 0 ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, "", result_type::local_failure ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, "\x01", result_type::local_failure ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, "\xff", result_type::local_failure ); + + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0 ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 1 ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, " ", result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0x00ff ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0x0100 ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0x0fff ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0x1000 ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ), result_type::local_failure ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd900 ), result_type::local_failure ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xde00 ), result_type::local_failure ); verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xfffe ) + " ", result_type::success, 1 ); verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xffff ) + " ", result_type::success, 2 ); verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd7ff ) + u16s_le( 0xdfff ), result_type::success, 2 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xdc00 ) + u16s_le( 0xdfff ), result_type::local_failure, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ) + u16s_le( 0x0020 ), result_type::local_failure, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ) + u16s_le( 0xff20 ), result_type::local_failure, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ) + u16s_le( 0xdf00 ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ) + u16s_le( 0xdfff ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xdbff ) + u16s_le( 0xdc00 ), result_type::success, 0 ); - verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xdbff ) + u16s_le( 0xdfff ), result_type::success, 0 ); - - verify_rule< utf16_le::one< 0x20 > >( __LINE__, __FILE__, u16s_le( 0x20 ), result_type::success, 0 ); - verify_rule< utf16_le::one< 0x20ac > >( __LINE__, __FILE__, u16s_le( 0x20ac ), result_type::success, 0 ); - verify_rule< utf16_le::one< 0x10437 > >( __LINE__, __FILE__, u16s_le( 0xd801 ) + u16s_le( 0xdc37 ), result_type::success, 0 ); - - verify_rule< utf16_le::bom >( __LINE__, __FILE__, u16s_le( 0xfeff ), result_type::success, 0 ); - verify_rule< utf16_le::bom >( __LINE__, __FILE__, u16s_le( 0xfffe ), result_type::local_failure, 2 ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xdc00 ) + u16s_le( 0xdfff ), result_type::local_failure ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ) + u16s_le( 0x0020 ), result_type::local_failure ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ) + u16s_le( 0xff20 ), result_type::local_failure ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ) + u16s_le( 0xdf00 ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xd800 ) + u16s_le( 0xdfff ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xdbff ) + u16s_le( 0xdc00 ), result_type::success ); + verify_rule< utf16_le::any >( __LINE__, __FILE__, u16s_le( 0xdbff ) + u16s_le( 0xdfff ), result_type::success ); + + verify_rule< utf16_le::one< 0x20 > >( __LINE__, __FILE__, u16s_le( 0x20 ), result_type::success ); + verify_rule< utf16_le::one< 0x20ac > >( __LINE__, __FILE__, u16s_le( 0x20ac ), result_type::success ); + verify_rule< utf16_le::one< 0x10437 > >( __LINE__, __FILE__, u16s_le( 0xd801 ) + u16s_le( 0xdc37 ), result_type::success ); + + verify_rule< utf16_le::bom >( __LINE__, __FILE__, u16s_le( 0xfeff ), result_type::success ); + verify_rule< utf16_le::bom >( __LINE__, __FILE__, u16s_le( 0xfffe ), result_type::local_failure ); verify_rule< utf16_le::string< 0x20, 0x20ac, 0x10437 > >( __LINE__, __FILE__, u16s_le( 0x20 ) + u16s_le( 0x20ac ) + u16s_le( 0xd801 ) + u16s_le( 0xdc37 ) + u16s_le( 0x20 ), result_type::success, 2 ); } diff --git a/packages/PEGTL/src/test/pegtl/verify_rule.hpp b/packages/PEGTL/src/test/pegtl/verify_rule.hpp index a6a8ef4a8..e8c516f6c 100644 --- a/packages/PEGTL/src/test/pegtl/verify_rule.hpp +++ b/packages/PEGTL/src/test/pegtl/verify_rule.hpp @@ -35,9 +35,11 @@ namespace TAO_PEGTL_NAMESPACE }; template< typename Rule, typename Eol = eol::lf_crlf > - void verify_rule( const std::size_t line, const char* file, const std::string& data, const result_type expected, std::size_t remain = 0 ) + void verify_rule( const std::size_t line, const char* file, const std::string& data, const result_type expected, int remain = -1 ) { - remain = ( expected == result_type::success ) ? remain : data.size(); + if( remain < 0 ) { + remain = ( expected == result_type::success ) ? 0 : int( data.size() ); + } { memory_input< tracking_mode::eager, Eol > in( data.data(), data.data() + data.size(), file, 0, line, 0 ); verify_impl_one< Rule, nothing >( line, file, data, in, expected, remain ); -- GitLab