summaryrefslogtreecommitdiff
path: root/src/theory/strings/regexp_operation.cpp
diff options
context:
space:
mode:
authorTianyi Liang <tianyi-liang@uiowa.edu>2014-11-26 18:11:35 -0600
committerTianyi Liang <tianyi-liang@uiowa.edu>2014-11-26 19:33:53 -0600
commit34e2436636d7a43dd6b9ec5439884f0d8960f06b (patch)
tree0e4e65cd9ef96f71145b70f654e9655b7c56e0bb /src/theory/strings/regexp_operation.cpp
parent29bdfca306a7cd35801c7d9cb3023d78a8b82a1f (diff)
add more functions for regular expressions
Diffstat (limited to 'src/theory/strings/regexp_operation.cpp')
-rw-r--r--src/theory/strings/regexp_operation.cpp109
1 files changed, 108 insertions, 1 deletions
diff --git a/src/theory/strings/regexp_operation.cpp b/src/theory/strings/regexp_operation.cpp
index 69b089c84..2752886cf 100644
--- a/src/theory/strings/regexp_operation.cpp
+++ b/src/theory/strings/regexp_operation.cpp
@@ -1653,8 +1653,115 @@ void RegExpOpr::splitRegExp(Node r, std::vector< PairNodes > &pset) {
}
}
+void RegExpOpr::flattenRegExp(Node r, std::vector< std::pair< CVC4::String, unsigned > > &fvec) {
+ Assert(false);
+ Assert(checkConstRegExp(r));
+ switch( r.getKind() ) {
+ case kind::REGEXP_EMPTY: {
+ //TODO
+ break;
+ }
+ case kind::REGEXP_SIGMA: {
+ CVC4::String s("a");
+ std::pair< CVC4::String, unsigned > tmp(s, 0);
+ //TODO
+ break;
+ }
+ case kind::STRING_TO_REGEXP: {
+ Assert(r[0].isConst());
+ CVC4::String s = r[0].getConst< CVC4::String >();
+ std::pair< CVC4::String, unsigned > tmp(s, 0);
+ //TODO
+ break;
+ }
+ case kind::REGEXP_CONCAT: {
+ for(unsigned i=0; i<r.getNumChildren(); i++) {
+ //TODO
+ }
+ break;
+ }
+ case kind::REGEXP_UNION: {
+ for(unsigned i=0; i<r.getNumChildren(); ++i) {
+ //TODO
+ }
+ break;
+ }
+ case kind::REGEXP_INTER: {
+ //TODO
+ break;
+ }
+ case kind::REGEXP_STAR: {
+ //TODO
+ break;
+ }
+ default: {
+ Unreachable();
+ }
+ }
+}
+
+void RegExpOpr::disjunctRegExp(Node r, std::vector<Node> &vec_or) {
+ switch(r.getKind()) {
+ case kind::REGEXP_EMPTY: {
+ vec_or.push_back(r);
+ break;
+ }
+ case kind::REGEXP_SIGMA: {
+ vec_or.push_back(r);
+ break;
+ }
+ case kind::STRING_TO_REGEXP: {
+ vec_or.push_back(r);
+ break;
+ }
+ case kind::REGEXP_CONCAT: {
+ disjunctRegExp(r[0], vec_or);
+ for(unsigned i=1; i<r.getNumChildren(); i++) {
+ std::vector<Node> vec_con;
+ disjunctRegExp(r[i], vec_con);
+ std::vector<Node> vec_or2;
+ for(unsigned k1=0; k1<vec_or.size(); k1++) {
+ for(unsigned k2=0; k2<vec_con.size(); k2++) {
+ Node tmp = Rewriter::rewrite( NodeManager::currentNM()->mkNode(kind::REGEXP_CONCAT, vec_or[k1], vec_con[k2]) );
+ if(std::find(vec_or2.begin(), vec_or2.end(), tmp) == vec_or2.end()) {
+ vec_or2.push_back( tmp );
+ }
+ }
+ }
+ vec_or = vec_or2;
+ }
+ break;
+ }
+ case kind::REGEXP_UNION: {
+ for(unsigned i=0; i<r.getNumChildren(); ++i) {
+ std::vector<Node> vec_or2;
+ disjunctRegExp(r[i], vec_or2);
+ vec_or.insert(vec_or.end(), vec_or2.begin(), vec_or2.end());
+ }
+ break;
+ }
+ case kind::REGEXP_INTER: {
+ Assert(checkConstRegExp(r));
+ Node rtmp = r[0];
+ bool spflag = false;
+ for(unsigned i=1; i<r.getNumChildren(); ++i) {
+ rtmp = intersect(rtmp, r[i], spflag);
+ }
+ disjunctRegExp(rtmp, vec_or);
+ break;
+ }
+ case kind::REGEXP_STAR: {
+ vec_or.push_back(r);
+ break;
+ }
+ default: {
+ Unreachable();
+ }
+ }
+}
+
//printing
-std::string RegExpOpr::niceChar( Node r ) {
+std::string RegExpOpr::niceChar(Node r) {
if(r.isConst()) {
std::string s = r.getConst<CVC4::String>().toString() ;
return s == "" ? "{E}" : ( s == " " ? "{ }" : s.size()>1? "("+s+")" : s );
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback