source: icGREP/icgrep-devel/icgrep/resolve_properties.cpp @ 4380

Last change on this file since 4380 was 4380, checked in by cameron, 4 years ago

UCD property resolution initial check in

File size: 4.2 KB
Line 
1/*
2 *  Copyright (c) 2014 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 <string>
8#include <re/re_re.h>
9#include <re/re_alt.h>
10#include <re/re_cc.h>
11#include <re/re_seq.h>
12#include <re/re_rep.h>
13#include <re/re_name.h>
14#include <re/re_diff.h>
15#include <re/re_intersect.h>
16#include <cc/cc_namemap.hpp>
17#include "UCD/PropertyAliases.h"
18#include "UCD/PropertyObjects.h"
19#include "UCD/PropertyObjectTable.h"
20#include "UCD/PropertyValueAliases.h"
21
22
23
24std::string canonicalize(std::string prop_or_val) {
25    std::locale loc;
26    std::string s = "";
27    for (unsigned int i = 0; i < prop_or_val.length(); ++i) {
28        char c = prop_or_val.at(i);
29        if ((c != '_') && (c != ' ') && (c != '-')) {
30            s += std::tolower(c, loc);
31        }
32    }
33    return s;
34}
35
36using namespace re;
37
38void resolveProperties(RE * re) {
39    if (Alt * alt = dyn_cast<Alt>(re)) {
40        for (auto i = alt->begin(); i != alt->end(); ++i) {
41            resolveProperties(*i);
42        }
43    }
44    else if (Seq * seq = dyn_cast<Seq>(re)) {
45        for (auto i = seq->begin(); i != seq->end(); ++i) {
46            resolveProperties(*i);
47        }
48    }
49    else if (Rep * rep = dyn_cast<Rep>(re)) {
50        resolveProperties(rep->getRE());
51    }
52    else if (Diff * diff = dyn_cast<Diff>(re)) {
53        resolveProperties(diff->getRH());
54        resolveProperties(diff->getLH());
55    }
56    else if (Intersect * e = dyn_cast<Intersect>(re)) {
57        resolveProperties(e->getRH());
58        resolveProperties(e->getLH());
59    }
60    else if (Name * name = dyn_cast<Name>(re)) {
61        if (name->getType() == Name::Type::UnicodeProperty) {
62            std::string prop = name->getNamespace();
63            std::string v = canonicalize_value_name(name->getName());
64            UCD::property_t theprop;
65            if (prop != "") {
66                prop = canonicalize_value_name(prop);
67                auto propit = UCD::alias_map.find(prop);
68                if (propit == UCD::alias_map.end()) {
69                    throw std::runtime_error("Unknown property value: " + prop);
70                }
71                theprop = propit->second;
72                if (theprop == UCD::gc) {
73                    // General Category
74                   
75                    int valcode = dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::gc])->GetPropertyValueEnumCode(v);
76                   
77                    if (valcode > 0) {
78                        name->setName(UCD::GC_ns::enum_names[valcode]);
79                    }
80                }
81                else if (theprop == UCD::sc) {
82                    // Script property identified
83                    throw std::runtime_error("Script property identified, aborting\n");
84                }
85                else if (theprop == UCD::scx) {
86                    // Script extension property identified
87                    throw std::runtime_error("Script extensions property identified, aborting\n");
88                }
89                else {
90                    throw std::runtime_error("other property identified, aborting\n");
91                }
92            }
93            else {
94                // No namespace (property) name.   Try as a general category.
95                int valcode = dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::gc])->GetPropertyValueEnumCode(v);
96                if (valcode > 0) {
97                    theprop = UCD::gc;
98                    name->setName(UCD::GC_ns::enum_names[valcode]);
99                }
100                else if (dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::sc])->GetPropertyValueEnumCode(v) > 0) {
101                    theprop = UCD::sc;
102                    throw std::runtime_error("Script property identified by value, aborting\n");
103                }
104
105                else {
106                    throw std::runtime_error("Unknown property, aborting\n");
107                }
108            }
109           
110                //name->setCompiled(compileCC(cast<CC>(d), mCG));
111        }
112    }
113    else if (!isa<CC>(re)) {
114        throw std::runtime_error("Unknown RE type in resolveProperties.");
115    }
116}
117
Note: See TracBrowser for help on using the repository browser.