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

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

Add support for ScriptExtensions? and Block properties

File size: 5.3 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 <re/re_start.h>
17#include <re/re_end.h>
18
19#include <cc/cc_namemap.hpp>
20#include "UCD/PropertyAliases.h"
21#include "UCD/PropertyObjects.h"
22#include "UCD/PropertyObjectTable.h"
23#include "UCD/PropertyValueAliases.h"
24
25
26
27std::string canonicalize(std::string prop_or_val) {
28    std::locale loc;
29    std::string s = "";
30    for (unsigned int i = 0; i < prop_or_val.length(); ++i) {
31        char c = prop_or_val.at(i);
32        if ((c != '_') && (c != ' ') && (c != '-')) {
33            s += std::tolower(c, loc);
34        }
35    }
36    return s;
37}
38
39using namespace re;
40
41void resolveProperties(RE * re) {
42    if (Alt * alt = dyn_cast<Alt>(re)) {
43        for (auto i = alt->begin(); i != alt->end(); ++i) {
44            resolveProperties(*i);
45        }
46    }
47    else if (Seq * seq = dyn_cast<Seq>(re)) {
48        for (auto i = seq->begin(); i != seq->end(); ++i) {
49            resolveProperties(*i);
50        }
51    }
52    else if (Rep * rep = dyn_cast<Rep>(re)) {
53        resolveProperties(rep->getRE());
54    }
55    else if (Diff * diff = dyn_cast<Diff>(re)) {
56        resolveProperties(diff->getRH());
57        resolveProperties(diff->getLH());
58    }
59    else if (Intersect * e = dyn_cast<Intersect>(re)) {
60        resolveProperties(e->getRH());
61        resolveProperties(e->getLH());
62    }
63    else if (Name * name = dyn_cast<Name>(re)) {
64        if (name->getType() == Name::Type::UnicodeProperty) {
65            std::string prop = name->getNamespace();
66            std::string v = canonicalize_value_name(name->getName());
67            UCD::property_t theprop;
68            if (prop != "") {
69                prop = canonicalize_value_name(prop);
70                auto propit = UCD::alias_map.find(prop);
71                if (propit == UCD::alias_map.end()) {
72                    throw std::runtime_error("Unknown property value: " + prop);
73                }
74                theprop = propit->second;
75                if (theprop == UCD::gc) {
76                    // General Category
77                    int valcode = dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::gc])->GetPropertyValueEnumCode(v);                   
78                    if (valcode > 0) {
79                        name->setName("__get_gc_" + UCD::GC_ns::enum_names[valcode]);
80                    }
81                }
82                else if (theprop == UCD::sc) {
83                    // Script property identified
84                    int valcode = dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::sc])->GetPropertyValueEnumCode(v);                   
85                    if (valcode > 0) {
86                        name->setName("__get_sc_" + UCD::SC_ns::enum_names[valcode]);
87                    }
88                }
89                else if (theprop == UCD::scx) {
90                    // Script extension property identified
91                    int valcode = dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::sc])->GetPropertyValueEnumCode(v);                   
92                    if (valcode > 0) {
93                        name->setName("__get_scx_" + UCD::SC_ns::enum_names[valcode]);
94                    }
95                }
96                else if (theprop == UCD::blk) {
97                    // Block property identified
98                    int valcode = dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::blk])->GetPropertyValueEnumCode(v);                   
99                    if (valcode > 0) {
100                        name->setName("__get_blk_" + UCD::BLK_ns::enum_names[valcode]);
101                    }
102                }
103                else {
104                    throw std::runtime_error("Property " + UCD::property_full_name[theprop] + " recognized, but not supported in icgrep 1.0");
105                }
106            }
107            else {
108                // No namespace (property) name.   Try as a general category.
109                int valcode = dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::gc])->GetPropertyValueEnumCode(v);
110                if (valcode > 0) {
111                    theprop = UCD::gc;
112                    name->setName("__get_gc_" + UCD::GC_ns::enum_names[valcode]);
113                    return;
114                }
115                valcode = dynamic_cast<UCD::EnumeratedPropertyObject *> (UCD::property_object_table[UCD::sc])->GetPropertyValueEnumCode(v);
116                if (valcode > 0) {
117                    theprop = UCD::sc;
118                    name->setName("__get_sc_" + UCD::SC_ns::enum_names[valcode]);
119                    return;
120                }
121                else {
122                    throw std::runtime_error("Unknown property, aborting\n");
123                }
124            }
125           
126                //name->setCompiled(compileCC(cast<CC>(d), mCG));
127        }
128    }
129    else if (!isa<CC>(re) && !isa<Start>(re) && !isa<End>(re) && !isa<Any>(re)) {
130        throw std::runtime_error("Unknown RE type in resolveProperties.");
131    }
132}
133
Note: See TracBrowser for help on using the repository browser.