32 const char &
operator[](
int index)
const {
return ptr[index]; }
33 int size()
const {
return length; }
37 for(
int i=0;i<length;i++)
39 std::string::const_iterator ii = std::find(alphabet.begin(), alphabet.end(), ptr[i]);
40 if (ii==alphabet.end())
47 static std::string
intersect(
const std::string &s,
const std::string &s2)
50 std::set_intersection(s.begin(), s.end(), s2.begin(), s2.end(), back_inserter(res));
61 for(
int i=0;i<ref.length;i++)
95 int Size()
const {
return s.size(); }
112 return l.MatchResultCount();
124 virtual std::string
Alphabet()
const {
return ""; }
134 virtual std::string
Alphabet()
const {
return std::string(c,1); }
137 if (s.size()!=1)
return false;
138 if (s[0]!=c)
return false;
157 std::sort(s.begin(), s.end());
158 std::unique(s.begin(), s.end());
163 const std::string &s1 = l1.Alphabet();
164 const std::string &s2 = l2.Alphabet();
167 if (intersect.size()==0)
176 bool smatch = l1.Match(start);
177 bool ematch = l2.Match(end);
189 for(
int i=0;i<=s.size();i++)
193 bool smatch = l1.Match(start);
194 bool ematch = l2.Match(end);
221 void Set(
int ii,
const StringRef &s)
const
226 if (ii==0) { l1.Set(ii, start); }
227 if (ii==1) { l2.Set(ii,end); }
228 std::cout <<
"ComposeLanguage:: Set error!" << ii <<
" " << start <<
" " <<
end << std::endl;
234 mutable StringRef m1,m2;
258 for(std::vector<Language*>::const_iterator i=vec.begin();i!=vec.end();i++)
262 std::sort(s.begin(), s.end());
263 std::unique(s.begin(), s.end());
276 return vec[0]->Match(s);
278 if ((vec.size()&1)==1)
286 std::vector<Language*> v;
287 for(
unsigned int i=0;i<vec.size();i+=2)
293 bool b = arr.
Match(s);
294 for(
unsigned int ii=0;ii<v.size();ii++)
312 std::vector<Language*> vec;
327 std::sort(s.begin(), s.end());
328 std::unique(s.begin(), s.end());
335 if (l1.Match(s)){ b1=
true; m=s;
return true; }
336 if (l2.Match(s)){ b2=
true; m=s;
return true; }
353 int Num()
const {
return num; }
357 for(std::vector<Language*>::const_iterator i=vec.begin();i!=vec.end();i++)
361 std::sort(s.begin(), s.end());
362 std::unique(s.begin(), s.end());
370 for(std::vector<Language*>::const_iterator i = vec.begin();i!=vec.end();i++, ii++)
385 std::vector<Language*> vec;
394 : d0(
'0'), d1(
'1'), d2(
'2'), d3(
'3'), d4(
'4'), d5(
'5'), d6(
'6'),
395 d7(
'7'), d8(
'8'), d9(
'9')
397 or_lang.push_back(&d0);
398 or_lang.push_back(&d1);
399 or_lang.push_back(&d2);
400 or_lang.push_back(&d3);
401 or_lang.push_back(&d4);
402 or_lang.push_back(&d5);
403 or_lang.push_back(&d6);
404 or_lang.push_back(&d7);
405 or_lang.push_back(&d8);
406 or_lang.push_back(&d9);
408 int Num()
const {
return or_lang.Num(); }
411 return or_lang.Match(s);
448 return new Repeat(i-1, lang);
453 return lang.Alphabet();
457 if (i==0)
return el.Match(s);
458 if (i==1) { m = s;
return lang.Match(s); }
459 return comp.Match(s);
468 return repeat_n->MatchResult(ii);
471 void Set(
int ii,
const StringRef &s)
const
473 if (ii==0 || !repeat_n)
479 return comp.Set(ii,s);
487 ComposeLanguage comp;
496 int Num()
const {
return num; }
499 return lang.Alphabet();
504 for(
int i=0;i<maxiterations;i++)
511 num = i;
return true;
526 void Set(
int i,
const StringRef &s)
const
548 std::cout << mr.
size() << std::endl;
549 for(
int i=0;i<mr.
size();i++)
560 return s.MatchResult(i);
583 std::sort(s.begin(), s.end());
584 std::unique(s.begin(), s.end());
590 return comp2.Match(s);
595 return comp2.MatchResultCount();
599 return comp2.MatchResult(i);
611template<
class State,
class Event>
630 if (
e==c && state == 0)
636 if (
e==c && state==0)
return 1;
641 if (state==1)
return true;
654 : sm1(sm1), sm2(sm2) { }
655 int NumStates()
const {
return sm1.NumStates()+sm2.NumStates(); }
657 bool Valid(
int state, Event event)
const
659 int i = sm1.NumStates();
662 if (sm1.IsFinal(state))
664 return sm2.Valid(sm2.Initial(), event);
668 return sm1.Valid(state, event);
673 return sm2.Valid(state-i, event);
678 int i = sm1.NumStates();
681 if (sm1.IsFinal(state))
683 return i+sm2.Transition(sm2.Initial(), event);
687 return sm1.Transition(state, event);
692 return i+sm2.Transition(state-i, event);
697 int i = sm1.NumStates();
698 if (state < i)
return false;
699 if (sm2.IsFinal(state-i))
return true;
713 : sm1(sm1), sm2(sm2) { }
716 return sm1.NumStates()+sm2.NumStates()+1;
722 bool Valid(
int state, Event event)
const
726 if (sm1.Valid(state, event))
return sm1.Valid(state,event);
727 if (sm2.Valid(state, event))
return sm2.Valid(state,event);
732 int i = sm1.NumStates();
735 return sm1.Valid(state-1, event);
739 return sm2.Valid(state-i-1, event);
747 if (sm1.Valid(state,event))
return sm1.Transition(state,event);
748 if (sm2.Valid(state,event))
return sm2.Transition(state,event);
753 int i = sm1.NumStates();
756 return 1+sm1.Transition(state-1,event);
760 return i+1+sm2.Transition(state-i-1, event);
766 int i = sm1.NumStates();
771 else if (state < i+1)
773 return sm1.IsFinal(state-1);
777 return sm2.IsFinal(state-i-1);
786template<
class State,
class Event>
796template<
class State,
class Event>
801 void Reset() { current_state = sm.Initial(); }
804 return sm.Valid(current_state, event);
808 current_state = sm.Transition(current_state, event);
810 bool Final()
const {
return sm.IsFinal(current_state); }
822 return std::string(events.begin(), events.end());
827 for(
int i=0;i<s.size();i++)
831 return state.
Final();
839 std::vector<char> events;
852 void AddLink(
State *st) { links.push_back(st); link_events.push_back(
'@'); }
853 void AddLink(
char c,
State *st) { links.push_back(st); link_events.push_back(c); }
860 int size = link_events.size();
861 for(
int i=0;i<
size;i++)
863 char c = link_events[i];
865 bool b = links[i]->IsStartGroup(
'*');
874 int size = link_events.size();
875 for(
int i=0;i<
size;i++)
877 char c = link_events[i];
879 bool b = links[i]->IsEndGroup(
'*');
889 int size = link_events.size();
890 for(
int i=0;i<
size;i++)
892 char c = link_events[i];
894 bool b = links[i]->IsFinal();
902 std::vector<char> res;
903 int size = link_events.size();
904 for(
int i=0;i<
size;i++)
906 char c = link_events[i];
908 std::vector<char> cc = links[i]->Lookup();
909 int size = cc.size();
910 for(
int k=0;k<
size;k++)
912 res.push_back(cc[k]);
922 int size = link_events.size();
923 for(
int i=0;i<
size;i++)
925 char c = link_events[i];
930 if (c==ca)
return links[i];
935 std::vector<State*> links;
936 std::vector<char> link_events;
942typedef std::pair<State*, State*>
SM;
950 return std::make_pair(first, second);
955 p1.second->AddLink(
'@', p2.first);
956 return std::make_pair(p1.first, p2.second);
961 p1.second->AddLink(
'@', p1.first);
962 return std::make_pair(p1.first, p1.second);
969 first->AddLink(
'@', p2.first);
972 p1.second->AddLink(
'@', last);
973 p2.second->AddLink(
'@', last);
974 return std::make_pair(first,last);
982 return std::make_pair(first,first);
987 for(
int i=1;i<
size;i++)
999 startgroup->
AddLink(
'@', s.first);
1002 s.second->AddLink(
'@', endgroup);
1003 return std::make_pair(startgroup, endgroup);
1008 if (alphabet.size()==0)
1011 return std::make_pair(first,first);
1013 char c = alphabet[0];
1015 int size = alphabet.size();
1016 for(
int i=1;i<
size;i++)
1024int find(
const std::vector<char> &c,
char cc)
1027 for(
int i=0;i<s;i++)
1029 if (c[i]==cc)
return i;
1034SM Not(std::vector<char> alphabet, std::vector<char> not_included)
1036 if (alphabet.size()==0)
1039 return std::make_pair(first,first);
1041 char c = alphabet[0];
1043 int size = alphabet.size();
1044 for(
int i=1;i<
size;i++)
1046 if (
find(not_included, alphabet[i]) != -1)
1057 s.second->SetFinal(
true);
1061bool Match(
SM sm,
const std::string &ss, std::vector<std::string> &res)
1063 std::vector<std::string> stack;
1065 State *st = sm.first;
1066 if (!st)
return false;
1069 for(
int i=0;i<sz;i++)
1075 stack.push_back(
"");
1080 stack[stack.size()-1]+=ss[i];
1086 res.push_back(stack.back());
1089 if (!st)
return false;
1093 if (st->
IsFinal())
return true;
1109 std::vector<std::string> res;
1110 bool b =
Match(s3,
"abcdefabcdefppppp", res);
1112 std::cout <<
"MATCH!" << std::endl;
1113 int size = res.size();
1114 for(
int i=0;i<
size;i++)
1116 std::cout <<
"P " << res[i] << std::endl;
Env e
Definition Common.cc:2
SM Concatenation(SM p1, SM p2)
Definition Language.hh:953
SM CharacterMatch(char c)
Definition Language.hh:945
void testlang()
Definition Language.hh:1100
SM Final(SM s)
Definition Language.hh:1055
SM Or(SM p1, SM p2)
Definition Language.hh:965
SM Not(std::vector< char > alphabet, std::vector< char > not_included)
Definition Language.hh:1034
SM Grouping(SM s)
Definition Language.hh:995
SM Any(std::vector< char > alphabet)
Definition Language.hh:1006
SM Repeat(SM p1)
Definition Language.hh:959
SM String(std::string s)
Definition Language.hh:977
bool Match(SM sm, const std::string &ss, std::vector< std::string > &res)
Definition Language.hh:1061
int find(const std::vector< char > &c, char cc)
Definition Language.hh:1024
Definition Effect.hh:1299
virtual int MatchResultCount() const
Definition Language.hh:593
virtual std::string Alphabet() const
Definition Language.hh:578
ArrayLanguage(Language &lang, Language &separator)
Definition Language.hh:575
virtual bool Match(const StringRef &s) const
Definition Language.hh:588
virtual StringRef MatchResult(int i) const
Definition Language.hh:597
Definition Language.hh:131
virtual std::string Alphabet() const
Definition Language.hh:134
virtual StringRef MatchResult(int i) const
Definition Language.hh:142
virtual int MatchResultCount() const
Definition Language.hh:141
CharLanguage(char c)
Definition Language.hh:133
bool Match(const StringRef &s) const
Definition Language.hh:135
int NumStates() const
Definition Language.hh:626
bool Valid(int state, char e) const
Definition Language.hh:628
int Transition(int state, char e) const
Definition Language.hh:634
bool IsFinal(int state) const
Definition Language.hh:639
int Initial() const
Definition Language.hh:627
CharStateMachine(char c)
Definition Language.hh:625
bool Match(const StringRef &s) const
Definition Language.hh:267
virtual std::string Alphabet() const
Definition Language.hh:255
ComposeArray()
Definition Language.hh:253
void push_back(Language *lang)
Definition Language.hh:254
virtual int MatchResultCount() const
Definition Language.hh:302
ComposeArray(It beg, It end)
Definition Language.hh:252
virtual StringRef MatchResult(int i) const
Definition Language.hh:306
Definition Language.hh:149
StringRef MatchResult(int i) const
Definition Language.hh:208
ComposeLanguage(Language &l1, Language &l2)
Definition Language.hh:151
virtual std::string Alphabet() const
Definition Language.hh:152
bool Match(const StringRef &s) const
Definition Language.hh:161
int MatchResultCount() const
Definition Language.hh:207
bool Valid(int state, Event event) const
Definition Language.hh:657
int Initial() const
Definition Language.hh:656
int Transition(int state, Event event) const
Definition Language.hh:676
bool IsFinal(int state) const
Definition Language.hh:695
int NumStates() const
Definition Language.hh:655
ConcatStateMachine(StateMachine< int, Event > &sm1, StateMachine< int, Event > &sm2)
Definition Language.hh:652
Definition Language.hh:391
Digit()
Definition Language.hh:393
int Num() const
Definition Language.hh:408
bool Match(const StringRef &s) const
Definition Language.hh:409
virtual int MatchResultCount() const
Definition Language.hh:413
virtual StringRef MatchResult(int i) const
Definition Language.hh:414
virtual std::string Alphabet() const
Definition Language.hh:415
Definition Language.hh:122
bool Match(const StringRef &s) const
Definition Language.hh:125
virtual std::string Alphabet() const
Definition Language.hh:124
virtual StringRef MatchResult(int i) const
Definition Language.hh:127
virtual int MatchResultCount() const
Definition Language.hh:126
bool Match(const StringRef &ss) const
Definition Language.hh:543
virtual StringRef MatchResult(int i) const
Definition Language.hh:558
Integer()
Definition Language.hh:542
int Num() const
Definition Language.hh:544
virtual int MatchResultCount() const
Definition Language.hh:557
virtual std::string Alphabet() const
Definition Language.hh:562
Definition Language.hh:238
Language * compose(Language *a, Language *b) const
Definition Language.hh:241
Language * empty() const
Definition Language.hh:240
Definition Language.hh:77
virtual int MatchResultCount() const =0
virtual ~Language()
Definition Language.hh:79
virtual std::string Alphabet() const =0
virtual StringRef MatchResult(int i) const =0
virtual bool Match(const StringRef &s) const =0
Array< int, char > * Index(int i) const
Definition Language.hh:104
MatchResultArray(Language &l)
Definition Language.hh:103
int Size() const
Definition Language.hh:110
~MatchResultArray()
Definition Language.hh:114
Definition Language.hh:788
virtual void ChangeInitial(State state)=0
virtual void MarkFinal(State state)=0
virtual void AddTransition(State state_a, State state_b, Event event)=0
virtual State AddState()=0
OrLanguage2(Language &l1, Language &l2)
Definition Language.hh:318
bool First() const
Definition Language.hh:319
bool Match(const StringRef &s) const
Definition Language.hh:331
bool Second() const
Definition Language.hh:320
virtual int MatchResultCount() const
Definition Language.hh:339
virtual std::string Alphabet() const
Definition Language.hh:322
virtual StringRef MatchResult(int i) const
Definition Language.hh:340
Definition Language.hh:347
bool Match(const StringRef &s) const
Definition Language.hh:366
virtual std::string Alphabet() const
Definition Language.hh:354
void push_back(Language *lang)
Definition Language.hh:352
OrLanguage(It beg, It end)
Definition Language.hh:350
OrLanguage()
Definition Language.hh:351
virtual StringRef MatchResult(int i) const
Definition Language.hh:383
virtual int MatchResultCount() const
Definition Language.hh:382
int Num() const
Definition Language.hh:353
Definition Language.hh:426
virtual int MatchResultCount() const
Definition Language.hh:461
Repeat(int i, Language &lang)
Definition Language.hh:428
Language * rep(int i, Language &lang) const
Definition Language.hh:432
~Repeat()
Definition Language.hh:431
bool Match(const StringRef &s) const
Definition Language.hh:455
virtual std::string Alphabet() const
Definition Language.hh:451
virtual StringRef MatchResult(int ii) const
Definition Language.hh:462
Definition Language.hh:493
StarLanguage(Language &lang, int maxiterations)
Definition Language.hh:495
virtual std::string Alphabet() const
Definition Language.hh:497
virtual int MatchResultCount() const
Definition Language.hh:516
virtual StringRef MatchResult(int i) const
Definition Language.hh:520
bool Match(const StringRef &s) const
Definition Language.hh:502
int Num() const
Definition Language.hh:496
virtual StringRef MatchResult(int i) const
Definition Language.hh:835
virtual std::string Alphabet() const
Definition Language.hh:820
virtual bool Match(const StringRef &s) const
Definition Language.hh:824
StateMachineLanguage(StateMachine< int, char > &sm, const std::vector< char > &events)
Definition Language.hh:819
virtual int MatchResultCount() const
Definition Language.hh:834
Definition Language.hh:798
bool ValidEvent(Event event) const
Definition Language.hh:802
bool Final() const
Definition Language.hh:810
void Reset()
Definition Language.hh:801
StateMachineState(StateMachine< State, Event > &sm)
Definition Language.hh:800
void SendEvent(Event event)
Definition Language.hh:806
Definition Language.hh:613
virtual bool IsFinal(State state) const =0
virtual State Transition(State state, Event event) const =0
virtual bool Valid(State state, Event event) const =0
virtual int NumStates() const =0
virtual State Initial() const =0
Definition Language.hh:88
char Index(int i) const
Definition Language.hh:91
StringRefArray(const StringRef &s)
Definition Language.hh:90
int Size() const
Definition Language.hh:95
Definition Language.hh:26
StringRef & operator=(const StringRef &ref)
Definition Language.hh:53
StringRef extend(const std::string &alphabet) const
Definition Language.hh:35
static std::string intersect(const std::string &s, const std::string &s2)
Definition Language.hh:47
int size() const
Definition Language.hh:33
const char & operator[](int index) const
Definition Language.hh:32
StringRef substr(int start, int length) const
Definition Language.hh:34
StringRef()
Definition Language.hh:28
StringRef(const StringRef &s, int start, int length)
Definition Language.hh:30
friend std::ostream & operator<<(std::ostream &o, const StringRef &ref)
Definition Language.hh:59
StringRef(const std::string &s)
Definition Language.hh:29
int Transition(int state, Event event) const
Definition Language.hh:743
UnionStateMachine(StateMachine< int, Event > &sm1, StateMachine< int, Event > &sm2)
Definition Language.hh:711
bool Valid(int state, Event event) const
Definition Language.hh:722
int NumStates() const
Definition Language.hh:714
bool IsFinal(int state) const
Definition Language.hh:764
int Initial() const
Definition Language.hh:718
d
Definition meshpage.php:3895
str
Definition meshpage.php:1778
n< br > font size
Definition meshpage.php:3536
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
Definition FightGame.hh:5
bool IsFinal() const
Definition Language.hh:887
void AddLink(State *st)
Definition Language.hh:852
void SetStartGroup(bool b)
Definition Language.hh:855
void SetFinal(bool f)
Definition Language.hh:854
bool IsStartGroup(char) const
Definition Language.hh:858
State * Follow(char ca) const
Definition Language.hh:920
void AddLink(char c, State *st)
Definition Language.hh:853
void SetEndGroup(bool b)
Definition Language.hh:856
std::vector< char > Lookup() const
Definition Language.hh:900
bool IsEndGroup(char) const
Definition Language.hh:872
num
Definition view.php:2821