1 | /* |
2 | * Copyright (c) 2015-2016, Intel Corporation |
3 | * |
4 | * Redistribution and use in source and binary forms, with or without |
5 | * modification, are permitted provided that the following conditions are met: |
6 | * |
7 | * * Redistributions of source code must retain the above copyright notice, |
8 | * this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of Intel Corporation nor the names of its contributors |
13 | * may be used to endorse or promote products derived from this software |
14 | * without specific prior written permission. |
15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
26 | * POSSIBILITY OF SUCH DAMAGE. |
27 | */ |
28 | |
29 | /** \file |
30 | * \brief Checks component trees for unsupported components. |
31 | */ |
32 | #include "ConstComponentVisitor.h" |
33 | #include "ComponentEUS.h" |
34 | #include "ComponentRepeat.h" |
35 | #include "ComponentWordBoundary.h" |
36 | #include "parse_error.h" |
37 | #include "unsupported.h" |
38 | |
39 | #include <sstream> |
40 | |
41 | namespace ue2 { |
42 | |
43 | /** \brief Visitor class that throws a ParseError exception when it encounters |
44 | * an unsupported component. */ |
45 | class UnsupportedVisitor : public DefaultConstComponentVisitor { |
46 | public: |
47 | ~UnsupportedVisitor() override; |
48 | using DefaultConstComponentVisitor::pre; |
49 | void pre(const ComponentAssertion &) override { |
50 | throw ParseError("Zero-width assertions are not supported." ); |
51 | } |
52 | void pre(const ComponentAtomicGroup &) override { |
53 | throw ParseError("Atomic groups are unsupported." ); |
54 | } |
55 | void pre(const ComponentBackReference &) override { |
56 | throw ParseError("Back-references are unsupported." ); |
57 | } |
58 | void pre(const ComponentCondReference &) override { |
59 | throw ParseError("Conditional references are not supported." ); |
60 | } |
61 | void pre(const ComponentEUS &c) override { |
62 | std::ostringstream str; |
63 | str << "\\X unsupported at index " << c.loc << "." ; |
64 | throw ParseError(str.str()); |
65 | } |
66 | void pre(const ComponentRepeat &c) override { |
67 | if (c.type == ComponentRepeat::REPEAT_POSSESSIVE) { |
68 | throw ParseError("Possessive quantifiers are not supported." ); |
69 | } |
70 | } |
71 | void pre(const ComponentWordBoundary &c) override { |
72 | if (c.ucp && !c.prefilter) { |
73 | std::ostringstream str; |
74 | str << (!c.negated ? "\\b" : "\\B" ) |
75 | << " unsupported in UCP mode at index " << c.loc << "." ; |
76 | throw ParseError(str.str()); |
77 | } |
78 | } |
79 | }; |
80 | |
81 | UnsupportedVisitor::~UnsupportedVisitor() {} |
82 | |
83 | void checkUnsupported(const Component &root) { |
84 | UnsupportedVisitor vis; |
85 | root.accept(vis); |
86 | } |
87 | |
88 | } // namespace ue2 |
89 | |