Ignore:
Timestamp:
Jan 2, 2015, 7:53:04 PM (4 years ago)
Author:
cameron
Message:

Handle ANY, ASSIGNED, ASCII properties

File:
1 edited

Legend:

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

    r4388 r4390  
    1616#include <re/re_start.h>
    1717#include <re/re_end.h>
    18 
    1918#include <cc/cc_namemap.hpp>
    2019#include "UCD/PropertyAliases.h"
     
    2221#include "UCD/PropertyObjectTable.h"
    2322#include "UCD/PropertyValueAliases.h"
     23
    2424
    2525class UnicodePropertyExpressionError : public std::exception {
     
    155155                // Try as a binary property.
    156156                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");
     157                if (propit != UCD::alias_map.end()) {
     158                    theprop = propit->second;
     159                    if (UCD::property_object_table[theprop]->the_kind == UCD::BinaryProperty) {
     160                        name->setName("__get_" + lowercase(UCD::property_enum_name[theprop]) + "_Y");
     161                        return;
     162                    }
     163                    else {
     164                        throw UnicodePropertyExpressionError("Error: property " + UCD::property_full_name[theprop] + " specified without a value");
     165                    }
    159166                }
    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");
     167                // Now try special cases of Unicode TR #18
     168                else if (v == "any") {
     169                    name->setDefinition(re::makeAny());
     170                    return;
     171                }
     172                else if (v == "assigned") {
     173                    re::Name * Cn = re::makeName("Cn", Name::Type::UnicodeProperty);
     174                    resolveProperties(Cn);
     175                    name->setDefinition(re::makeDiff(re::makeAny(), Cn));
     176                    return;
     177                }
     178                else if (v == "ascii") {
     179                    name->setName("__get_blk_ASCII");
    163180                    return;
    164181                }
    165182                else {
    166                     throw UnicodePropertyExpressionError("Error: property " + UCD::property_full_name[theprop] + " specified without a value");
     183                    throw UnicodePropertyExpressionError("Expected a general category, script or binary property name, but '" + name->getName() + "' found instead");
    167184                }
    168185            }
Note: See TracChangeset for help on using the changeset viewer.