source: icGREP/icgrep-devel/icgrep/re/validation.cpp @ 6184

Last change on this file since 6184 was 6178, checked in by cameron, 9 months ago

RE Validation

File size: 3.7 KB
Line 
1/*
2 *  Copyright (c) 2018 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include <re/validation.h>
8#include <re/re_toolchain.h>
9#include <re/re_any.h>
10#include <re/re_name.h>
11#include <re/re_cc.h>
12#include <re/re_start.h>
13#include <re/re_end.h>
14#include <re/re_alt.h>
15#include <re/re_seq.h>
16#include <re/re_diff.h>
17#include <re/re_intersect.h>
18#include <re/re_group.h>
19#include <re/re_range.h>
20#include <re/re_assertion.h>
21#include <cc/alphabet.h>
22#include <re/printer_re.h>
23#include <llvm/Support/raw_ostream.h>
24#include <llvm/Support/ErrorHandling.h>
25
26namespace re {
27
28bool RE_Validator::validateRE(RE * re) {
29    bool validated = validate(re);
30    if ((mValidatorName != "") && (PrintOptionIsSet(ShowAllREs) || (PrintOptionIsSet(ShowREs) && (!validated))))  {
31        llvm::errs() << mValidatorName << (validated ? " success:\n" : " failure:\n") << Printer_RE::PrintRE(re) << '\n';
32    }
33    return validated;
34}
35
36bool RE_Validator::validate(RE * const re) {
37    using T = RE::ClassTypeId;
38#define VALIDATE(Type) \
39case T::Type: return validate##Type(llvm::cast<Type>(re)); break
40    switch (re->getClassTypeId()) {
41            VALIDATE(Alt);
42            VALIDATE(Assertion);
43            VALIDATE(CC);
44            VALIDATE(Range);
45            VALIDATE(Diff);
46            VALIDATE(End);
47            VALIDATE(Intersect);
48            VALIDATE(Name);
49            VALIDATE(Group);
50            VALIDATE(Rep);
51            VALIDATE(Seq);
52            VALIDATE(Start);
53        default: llvm_unreachable("Unknown RE type");
54    }
55#undef VALIDATE
56}
57
58bool RE_Validator::validateName(Name * n) {
59    RE * def = n->getDefinition();
60    return (def) && validate(def);
61}
62
63bool RE_Validator::validateCC(CC * cc) {
64    return true;
65}
66
67bool RE_Validator::validateStart(Start * s) {
68    return true;
69}
70
71bool RE_Validator::validateEnd(End * e) {
72    return true;
73}
74
75bool RE_Validator::validateSeq(Seq * seq) {
76    for (RE * e : *seq) {
77        if (!validate(e)) return false;
78    }
79    return true;
80}
81
82bool RE_Validator::validateAlt(Alt * alt) {
83    for (RE * e : *alt) {
84        if (!validate(e)) return false;
85    }
86    return true;
87}
88
89bool RE_Validator::validateRep(Rep * r) {
90    return validate(r->getRE());
91}
92
93bool RE_Validator::validateIntersect(Intersect * ix) {
94    return validate(ix->getLH()) && validate(ix->getRH());
95}
96
97bool RE_Validator::validateDiff(Diff * d) {
98    return validate(d->getLH()) && validate(d->getRH());
99}
100
101bool RE_Validator::validateRange(Range * rg) {
102    return validate(rg->getLo()) && validate(rg->getHi());
103}
104
105bool RE_Validator::validateGroup(Group * g) {
106    return validate(g->getRE());
107}
108
109bool RE_Validator::validateAssertion(Assertion * a) {
110    return validate(a->getAsserted());
111}
112
113bool validateNamesDefined(RE * r) {
114    return RE_Validator("NamesDefinedValidator").validateRE(r);
115}
116   
117class AlphabetValidator : public RE_Validator {
118public:
119    AlphabetValidator(const cc::Alphabet * a) : RE_Validator("AlphabetValidator"), mAlphabet(a) {}
120   
121    bool validateCC(CC * cc) override {return cc->getAlphabet() == mAlphabet;}
122private:
123    const cc::Alphabet * mAlphabet;
124};
125
126bool validateAlphabet(const cc::Alphabet * a, RE * r) {
127    return AlphabetValidator(a).validateRE(r);
128}
129   
130class AssertionFreeValidator : public RE_Validator {
131public:
132    AssertionFreeValidator() : RE_Validator("AssertionFreeValidator") {}
133   
134    bool validateAssertion(Assertion * a) override {return false;}
135    bool validateStart(Start * s) override {return false;}
136    bool validateEnd(End * e) override {return false;}
137};
138
139bool validateAssertionFree(RE * r) {
140    return AssertionFreeValidator().validateRE(r);
141}
142
143}
Note: See TracBrowser for help on using the repository browser.