Ignore:
Timestamp:
Jan 2, 2015, 9:28:01 AM (4 years ago)
Author:
cameron
Message:

Add derived core properties such as math, alpha; refine the property resolver

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/resolve_properties.cpp

    r4386 r4388  
    11/*
    2  *  Copyright (c) 2014 International Characters.
     2 *  Copyright (c) 2015 International Characters.
    33 *  This software is licensed to the public under the Open Software License 3.0.
    44 *  icgrep is a trademark of International Characters.
     
    2323#include "UCD/PropertyValueAliases.h"
    2424
    25 
     25class UnicodePropertyExpressionError : public std::exception {
     26public:
     27    UnicodePropertyExpressionError(const std::string && msg) noexcept : _msg(msg) {};
     28    const char* what() const noexcept { return _msg.c_str();};
     29private:
     30    inline UnicodePropertyExpressionError() noexcept {}
     31    const std::string _msg;
     32};
    2633
    2734std::string canonicalize(std::string prop_or_val) {
     
    3340            s += std::tolower(c, loc);
    3441        }
     42    }
     43    return s;
     44}
     45
     46std::string lowercase(std::string prop_or_val) {
     47    std::locale loc;
     48    std::string s = "";
     49    for (unsigned int i = 0; i < prop_or_val.length(); ++i) {
     50        char c = prop_or_val.at(i);
     51        s += std::tolower(c, loc);
    3552    }
    3653    return s;
     
    7087                auto propit = UCD::alias_map.find(prop);
    7188                if (propit == UCD::alias_map.end()) {
    72                     throw std::runtime_error("Unknown property value: " + prop);
     89                    throw UnicodePropertyExpressionError("Expected a property name, but '" + name->getNamespace() + "' found instead");
    7390                }
    7491                theprop = propit->second;
     
    7996                        name->setName("__get_gc_" + UCD::GC_ns::enum_names[valcode]);
    8097                    }
     98                    else throw UnicodePropertyExpressionError("Erroneous property value for general_category property");
    8199                }
    82100                else if (theprop == UCD::sc) {
     
    86104                        name->setName("__get_sc_" + UCD::SC_ns::enum_names[valcode]);
    87105                    }
     106                    else throw UnicodePropertyExpressionError("Erroneous property value for script property");
    88107                }
    89108                else if (theprop == UCD::scx) {
     
    93112                        name->setName("__get_scx_" + UCD::SC_ns::enum_names[valcode]);
    94113                    }
     114                    else throw UnicodePropertyExpressionError("Erroneous property value for script_extension property");
    95115                }
    96116                else if (theprop == UCD::blk) {
     
    100120                        name->setName("__get_blk_" + UCD::BLK_ns::enum_names[valcode]);
    101121                    }
     122                    else throw UnicodePropertyExpressionError("Erroneous property value for block property");
     123                }
     124                else if (UCD::property_object_table[theprop]->the_kind == UCD::BinaryProperty){
     125                    auto valit = UCD::Binary_ns::aliases_only_map.find(v);
     126                    if (valit == UCD::Binary_ns::aliases_only_map.end()) {
     127                        throw UnicodePropertyExpressionError("Erroneous property value for binary property " + UCD::property_full_name[theprop]);
     128                    }
     129                    if (valit->second == UCD::Binary_ns::Y) {
     130                        name->setName("__get_" + lowercase(UCD::property_enum_name[theprop]) + "_Y");
     131                        return;
     132                    }
     133                    else {
     134                        throw UnicodePropertyExpressionError("Negated binary property " + UCD::property_full_name[theprop] + " recognized, but not supported");
     135                    }
    102136                }
    103137                else {
    104                     throw std::runtime_error("Property " + UCD::property_full_name[theprop] + " recognized, but not supported in icgrep 1.0");
     138                    throw UnicodePropertyExpressionError("Property " + UCD::property_full_name[theprop] + " recognized, but not supported in icgrep 1.0");
    105139                }
    106140            }
     
    119153                    return;
    120154                }
     155                // Try as a binary property.
     156                auto propit = UCD::alias_map.find(v);
     157                if (propit == UCD::alias_map.end()) {
     158                    throw UnicodePropertyExpressionError("Expected a general category, script or binary property name, but '" + name->getName() + "' found instead");
     159                }
     160                theprop = propit->second;
     161                if (UCD::property_object_table[theprop]->the_kind == UCD::BinaryProperty) {
     162                    name->setName("__get_" + lowercase(UCD::property_enum_name[theprop]) + "_Y");
     163                    return;
     164                }
    121165                else {
    122                     throw std::runtime_error("Unknown property, aborting\n");
     166                    throw UnicodePropertyExpressionError("Error: property " + UCD::property_full_name[theprop] + " specified without a value");
    123167                }
    124168            }
     
    128172    }
    129173    else if (!isa<CC>(re) && !isa<Start>(re) && !isa<End>(re) && !isa<Any>(re)) {
    130         throw std::runtime_error("Unknown RE type in resolveProperties.");
     174        throw UnicodePropertyExpressionError("Unknown RE type in resolveProperties.");
    131175    }
    132176}
Note: See TracChangeset for help on using the changeset viewer.