Ignore:
Timestamp:
Jul 31, 2014, 11:07:49 AM (5 years ago)
Author:
daled
Message:

The parser is now able to parse unicode categories.

File:
1 edited

Legend:

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

    r3934 r3935  
    329329            return cc_retVal;
    330330        }
     331        else if (s.operator [](1) == 'p')
     332        {
     333            return cc_retVal = parse_unicode_category(s.substr(2, s.length() - 2));
     334        }
    331335        else
    332336        {
     
    441445}
    442446
     447parse_result_retVal RE_Parser::parse_unicode_category(std::string s)
     448{
     449    parse_result_retVal result_retVal;
     450
     451    if (s.operator [](0) == '{')
     452    {
     453        Name* name = new Name();
     454        result_retVal = parse_unicode_category1(s.substr(1,1), s.substr(2, s.length() - 2), name);
     455    }
     456    else
     457    {
     458        result_retVal.result = new ParseFailure("Incorrect Unicode character class format!");
     459        result_retVal.remaining = "";
     460    }
     461
     462    return result_retVal;
     463}
     464
     465parse_result_retVal RE_Parser::parse_unicode_category1(std::string character, std::string s, Name* name_sofar)
     466{
     467    parse_result_retVal unicode_cat1_retVal;
     468
     469    if (s.length() == 0)
     470    {
     471        delete name_sofar;
     472        unicode_cat1_retVal.result = new ParseFailure("Unclosed Unicode character class!");
     473        unicode_cat1_retVal.remaining = "";
     474    }
     475    else if (s.operator [](0) == '}')
     476    {
     477        name_sofar->setName(name_sofar->getName() + character);
     478        if (isValidUnicodeCategoryName(name_sofar))
     479        {
     480            unicode_cat1_retVal.result = new ParseSuccess(name_sofar);
     481            unicode_cat1_retVal.remaining = s.substr(1, s.length() - 1);
     482        }
     483        else
     484        {
     485            unicode_cat1_retVal.result = new ParseFailure("Unknown Unicode character class!");
     486            unicode_cat1_retVal.remaining = s.substr(1, s.length() - 1);
     487        }
     488    }
     489    else
     490    {
     491        name_sofar->setName(name_sofar->getName() + character);
     492        unicode_cat1_retVal = parse_unicode_category1(s.substr(0,1), s.substr(1, s.length() - 1), name_sofar);
     493    }
     494
     495    return unicode_cat1_retVal;
     496}
     497
    443498parse_result_retVal RE_Parser::parse_cc_body(std::string s)
    444499{
     
    573628        int hexval_sofar = 0;
    574629        int_retVal = parse_hex_body(hexval_sofar, s.substr(1, s.length() - 1));
    575 
    576630    }
    577631    else
     
    688742}
    689743
    690 
    691 
    692 
    693 
    694 
    695 
    696 
    697 
    698 
    699 
    700 
    701 
    702 
    703 
    704 
    705 
    706 
    707 
    708 
    709 
    710 
    711 
     744bool RE_Parser::isValidUnicodeCategoryName(Name* name)
     745{
     746    std::string cat_name = name->getName();
     747
     748    if (cat_name == "Cc")
     749        return true;
     750    else if (cat_name == "Cf")
     751        return true;
     752    else if (cat_name == "Cn")
     753        return true;
     754    else if (cat_name == "Co")
     755        return true;
     756    else if (cat_name == "Cs")
     757        return true;
     758    else if (cat_name == "C")
     759        return true;
     760    else if (cat_name == "Ll")
     761        return true;
     762    else if (cat_name == "Lt")
     763        return true;
     764    else if (cat_name == "Lu")
     765        return true;
     766    else if (cat_name == "L&")
     767        return true;
     768    else if (cat_name == "Lc")
     769        return true;
     770    else if (cat_name == "Lm")
     771        return true;
     772    else if (cat_name == "Lo")
     773        return true;
     774    else if (cat_name == "L")
     775        return true;
     776    else if (cat_name == "Mc")
     777        return true;
     778    else if (cat_name == "Me")
     779        return true;
     780    else if (cat_name == "Mn")
     781        return true;
     782    else if (cat_name == "M")
     783        return true;
     784    else if (cat_name == "Nd")
     785        return true;
     786    else if (cat_name == "Nl")
     787        return true;
     788    else if (cat_name == "No")
     789        return true;
     790    else if (cat_name == "N")
     791        return true;
     792    else if (cat_name == "Pc")
     793        return true;
     794    else if (cat_name == "Pd")
     795        return true;
     796    else if (cat_name == "Pe")
     797        return true;
     798    else if (cat_name == "Pf")
     799        return true;
     800    else if (cat_name == "Pi")
     801        return true;
     802    else if (cat_name == "Po")
     803        return true;
     804    else if (cat_name == "Ps")
     805        return true;
     806    else if (cat_name == "P")
     807        return true;
     808    else if (cat_name == "Sc")
     809        return true;
     810    else if (cat_name == "Sk")
     811        return true;
     812    else if (cat_name == "Sm")
     813        return true;
     814    else if (cat_name == "So")
     815        return true;
     816    else if (cat_name == "S")
     817        return true;
     818    else if (cat_name == "Zl")
     819        return true;
     820    else if (cat_name == "Zp")
     821        return true;
     822    else if (cat_name == "Zs")
     823        return true;
     824    else if (cat_name == "Z")
     825        return true;
     826    else
     827        return false;
     828}
     829
     830
     831
     832
     833
     834
     835
     836
     837
     838
     839
     840
     841
     842
     843
     844
     845
     846
     847
     848
     849
Note: See TracChangeset for help on using the changeset viewer.