GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
Language.hh
Go to the documentation of this file.
1//
2// Copyright (C) 2009 Tero Pulkkinen
3// Released under LGPL License.
4//
5// This file is part of Polygon.
6//
7// Polygon is free software: you can redistribute it and/or modify
8// it under the terms of the GNU General Public License as published by
9// the Free Software Foundation, either version 3 of the License, or
10// (at your option) any later version.
11//
12// Polygon is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17// You should have received a copy of the GNU Library General Public License
18// along with Polygon. If not, see <http://www.gnu.org/licenses/>.
19//
20
21#include <iostream>
22#include <algorithm>
23#include "Monoid.hh"
24
26{
27public:
28 StringRef() : ptr(0), length(0) { }
29 StringRef(const std::string &s) : ptr(&s[0]), length(s.size()) { }
30 StringRef(const StringRef &s, int start, int length) : ptr(&s[start]), length(length) { }
31 //char &operator[](int index) { return ptr[index]; }
32 const char &operator[](int index) const { return ptr[index]; }
33 int size() const { return length; }
34 StringRef substr(int start, int length) const { return StringRef(*this, start, length); }
35 StringRef extend(const std::string &alphabet) const
36 {
37 for(int i=0;i<length;i++)
38 {
39 std::string::const_iterator ii = std::find(alphabet.begin(), alphabet.end(), ptr[i]);
40 if (ii==alphabet.end())
41 {
42 return StringRef(*this, 0,i);
43 }
44 }
45 return StringRef(*this, 0, length);
46 }
47 static std::string intersect(const std::string &s, const std::string &s2)
48 {
49 std::string res;
50 std::set_intersection(s.begin(), s.end(), s2.begin(), s2.end(), back_inserter(res));
51 return res;
52 }
54 {
55 ptr = ref.ptr;
56 length = ref.length;
57 return *this;
58 }
59 friend std::ostream &operator<<(std::ostream &o, const StringRef &ref)
60 {
61 for(int i=0;i<ref.length;i++)
62 {
63 o << ref.ptr[i];
64 }
65 return o;
66 }
67private:
68 const char *ptr;
69 int length;
70};
71
72//
73// LANGUAGE
74//
75
77{
78public:
79 virtual ~Language() { }
80 virtual std::string Alphabet() const=0;
81 virtual bool Match(const StringRef &s) const=0;
82
83 virtual int MatchResultCount() const=0;
84 virtual StringRef MatchResult(int i) const=0;
85
86};
87class StringRefArray : public Array<int, char>
88{
89public:
90 StringRefArray(const StringRef &s) : s(s) { }
91 char Index(int i) const
92 {
93 return s[i];
94 }
95 int Size() const { return s.size(); }
96private:
97 const StringRef &s;
98};
99
100class MatchResultArray : public ArrayArray<int, int, char>
101{
102public:
103 MatchResultArray(Language &l) : l(l), refarray(0) { }
105 {
106 delete refarray;
107 refarray = new StringRefArray(l.MatchResult(i));
108 return refarray;
109 }
110 int Size() const
111 {
112 return l.MatchResultCount();
113 }
114 ~MatchResultArray() { delete refarray; }
115private:
116 Language &l;
117 mutable StringRefArray *refarray;
118};
119
120
122{
123public:
124 virtual std::string Alphabet() const { return ""; }
125 bool Match(const StringRef &s) const { return s.size()==0; }
126 virtual int MatchResultCount() const { return 0; }
127 virtual StringRef MatchResult(int i) const { return StringRef(""); }
128};
129
130class CharLanguage : public Language
131{
132public:
133 CharLanguage(char c) : c(c) { }
134 virtual std::string Alphabet() const { return std::string(c,1); }
135 bool Match(const StringRef &s) const
136 {
137 if (s.size()!=1) return false;
138 if (s[0]!=c) return false;
139 return true;
140 }
141 virtual int MatchResultCount() const { return 0; }
142 virtual StringRef MatchResult(int i) const { return StringRef(""); }
143private:
144 char c;
145};
146
147
149{
150public:
151 ComposeLanguage(Language &l1, Language &l2) : l1(l1), l2(l2) { }
152 virtual std::string Alphabet() const
153 {
154 std::string s;
155 s+=l1.Alphabet();
156 s+=l2.Alphabet();
157 std::sort(s.begin(), s.end());
158 std::unique(s.begin(), s.end());
159 return s;
160 }
161 bool Match(const StringRef &s) const
162 {
163 const std::string &s1 = l1.Alphabet();
164 const std::string &s2 = l2.Alphabet();
165 std::string intersect = StringRef::intersect(s1,s2);
166
167 if (intersect.size()==0)
168 {
169 StringRef str = s.extend(l1.Alphabet());
170 int i = str.size();
171 //for(int i=0;i<=s.size();i++)
172 // {
173 StringRef start = s.substr(0,i);
174 StringRef end = s.substr(i,s.size()-i);
175 //std::cout << "Try Compose Split: " << start << ";" << end << std::endl;
176 bool smatch = l1.Match(start);
177 bool ematch = l2.Match(end);
178 if (smatch&&ematch)
179 {
180 num = i;
181 m1 = start;
182 m2 = end;
183 //std::cout << "Compose Split: " << start << ";" << end << std::endl;
184 return true;
185 }
186 }
187 else
188 {
189 for(int i=0;i<=s.size();i++)
190 {
191 StringRef start = s.substr(0,i);
192 StringRef end = s.substr(i,s.size()-i);
193 bool smatch = l1.Match(start);
194 bool ematch = l2.Match(end);
195 if (smatch&&ematch)
196 {
197 num = i;
198 m1 = start;
199 m2 = end;
200 //std::cout << "Compose Split: " << start << ";" << end << std::endl;
201 return true;
202 }
203 }
204 }
205 return false;
206 }
207 int MatchResultCount() const { return 2; }
209 {
210 if (i==0)
211 {
212 return m1;
213 }
214 else
215 {
216 return m2;
217 }
218 }
219
220#if 0
221 void Set(int ii, const StringRef &s) const
222 {
223 Match(s);
224 StringRef start = s.substr(0,num);
225 StringRef end = s.substr(num,s.size()-num);
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;
229 }
230#endif
231private:
232 mutable int num;
233 Language &l1, &l2;
234 mutable StringRef m1,m2;
235};
236
237class LanguageMonoid : public Monoid2<Language*>
238{
239public:
240 Language* empty() const { return new EmptyLanguage; }
242 {
243 return new ComposeLanguage(*a, *b);
244 }
245};
246
247
248class ComposeArray : public Language
249{
250public:
251 template<class It>
252 ComposeArray(It beg, It end) : vec(beg,end) { }
254 void push_back(Language *lang) { vec.push_back(lang); }
255 virtual std::string Alphabet() const
256 {
257 std::string s;
258 for(std::vector<Language*>::const_iterator i=vec.begin();i!=vec.end();i++)
259 {
260 s+=(*i)->Alphabet();
261 }
262 std::sort(s.begin(), s.end());
263 std::unique(s.begin(), s.end());
264 return s;
265 }
266
267 bool Match(const StringRef &s) const
268 {
269 if (vec.size()==0)
270 {
272 return l.Match(s);
273 }
274 if (vec.size()==1)
275 {
276 return vec[0]->Match(s);
277 }
278 if ((vec.size()&1)==1)
279 { // odd count
280 ComposeArray arr(vec.begin(), vec.end()-1);
281 ComposeLanguage l(arr, **(vec.end()-1));
282 return l.Match(s);
283 }
284 else
285 {
286 std::vector<Language*> v;
287 for(unsigned int i=0;i<vec.size();i+=2)
288 {
289 Language *comp = new ComposeLanguage(*(vec[i]), *(vec[i+1]));
290 v.push_back(comp);
291 }
292 ComposeArray arr(v.begin(), v.end());
293 bool b = arr.Match(s);
294 for(unsigned int ii=0;ii<v.size();ii++)
295 {
296 delete v[ii];
297 }
298 return b;
299 }
300
301 }
302 virtual int MatchResultCount() const
303 {
304 return vec.size();
305 }
306 virtual StringRef MatchResult(int i) const
307 {
308 return StringRef(""); // TODO... NOT WORKING...
309 }
310
311private:
312 std::vector<Language*> vec;
313};
314
315class OrLanguage2 : public Language
316{
317public:
318 OrLanguage2(Language &l1, Language &l2) : l1(l1), l2(l2) { }
319 bool First() const { return b1; }
320 bool Second() const { return b2; }
321
322 virtual std::string Alphabet() const
323 {
324 std::string s;
325 s+=l1.Alphabet();
326 s+=l2.Alphabet();
327 std::sort(s.begin(), s.end());
328 std::unique(s.begin(), s.end());
329 return s;
330 }
331 bool Match(const StringRef &s) const
332 {
333 b1 = false;
334 b2 = false;
335 if (l1.Match(s)){ b1=true; m=s; return true; }
336 if (l2.Match(s)){ b2=true; m=s; return true; }
337 return false;
338 }
339 virtual int MatchResultCount() const { return 1; }
340 virtual StringRef MatchResult(int i) const { return m; }
341private:
342 Language &l1, &l2;
343 mutable StringRef m;
344 mutable bool b1,b2;
345};
346class OrLanguage : public Language
347{
348public:
349 template<class It>
350 OrLanguage(It beg, It end) : vec(beg,end) { }
352 void push_back(Language *lang) { vec.push_back(lang); }
353 int Num() const { return num; }
354 virtual std::string Alphabet() const
355 {
356 std::string s;
357 for(std::vector<Language*>::const_iterator i=vec.begin();i!=vec.end();i++)
358 {
359 s+=(*i)->Alphabet();
360 }
361 std::sort(s.begin(), s.end());
362 std::unique(s.begin(), s.end());
363 return s;
364 }
365
366 bool Match(const StringRef &s) const
367 {
368 num = 0;
369 int ii = 0;
370 for(std::vector<Language*>::const_iterator i = vec.begin();i!=vec.end();i++, ii++)
371 {
372 if ((*i)->Match(s))
373 {
374 num = ii;
375 m=s;
376 //std::cout << "Or matched " << s << " " << num << std::endl;
377 return true;
378 }
379 }
380 return false;
381 }
382 virtual int MatchResultCount() const { return 1; }
383 virtual StringRef MatchResult(int i) const { return m; }
384private:
385 std::vector<Language*> vec;
386 mutable StringRef m;
387 mutable int num;
388};
389
390class Digit : public Language
391{
392public:
394 : d0('0'), d1('1'), d2('2'), d3('3'), d4('4'), d5('5'), d6('6'),
395 d7('7'), d8('8'), d9('9')
396 {
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);
407 }
408 int Num() const { return or_lang.Num(); }
409 bool Match(const StringRef &s) const
410 {
411 return or_lang.Match(s);
412 }
413 virtual int MatchResultCount() const { return or_lang.MatchResultCount(); }
414 virtual StringRef MatchResult(int i) const { return or_lang.MatchResult(i); }
415 virtual std::string Alphabet() const
416 {
417 return "0123456789";
418 }
419
420private:
421 CharLanguage d0,d1,d2,d3,d4,d5,d6,d7,d8,d9;
422 OrLanguage or_lang;
423};
424
425class Repeat : public Language
426{
427public:
428 Repeat(int i, Language &lang) : i(i), lang(lang), repeat_n(rep(i,lang)), comp(*repeat_n, lang)
429 {
430 }
431 ~Repeat() { if (i != 2) delete repeat_n; }
432 Language *rep(int i, Language &lang) const
433 {
434 if (i==0)
435 {
436 return 0;
437 }
438 if (i==1)
439 {
440 return 0;
441 }
442 if (i==2)
443 {
444 return &lang;
445 }
446 else
447 {
448 return new Repeat(i-1, lang);
449 }
450 }
451 virtual std::string Alphabet() const
452 {
453 return lang.Alphabet();
454 }
455 bool Match(const StringRef &s) const
456 {
457 if (i==0) return el.Match(s);
458 if (i==1) { m = s; return lang.Match(s); }
459 return comp.Match(s);
460 }
461 virtual int MatchResultCount() const { return i; }
462 virtual StringRef MatchResult(int ii) const
463 {
464 if (i==1)
465 {
466 return m;
467 }
468 return repeat_n->MatchResult(ii);
469 }
470#if 0
471 void Set(int ii, const StringRef &s) const
472 {
473 if (ii==0 || !repeat_n)
474 {
475 lang.Match(s);
476 }
477 else
478 {
479 return comp.Set(ii,s);
480 }
481 }
482#endif
483private:
484 int i;
485 Language &lang;
486 Language *repeat_n;
487 ComposeLanguage comp;
488 EmptyLanguage el;
489 mutable StringRef m;
490};
491
492class StarLanguage : public Language
493{
494public:
495 StarLanguage(Language &lang, int maxiterations) : lang(lang), maxiterations(maxiterations) { }
496 int Num() const { return num; }
497 virtual std::string Alphabet() const
498 {
499 return lang.Alphabet();
500 }
501
502 bool Match(const StringRef &s) const
503 {
504 for(int i=0;i<maxiterations;i++) // magic number 20. Should be larger probably.
505 {
506 Repeat r(i, lang);
507 if (r.Match(s))
508 {
509 m = s;
510 //std::cout << "Star match " << s << " " << i << std::endl;
511 num = i; return true;
512 }
513 }
514 return false; // never will be done..
515 }
516 virtual int MatchResultCount() const
517 {
518 return 1;
519 }
520 virtual StringRef MatchResult(int i) const
521 {
522 return m;
523 }
524
525#if 0
526 void Set(int i, const StringRef &s) const
527 {
528 Repeat r(i,lang);
529 r.Set(i, s);
530 }
531#endif
532private:
533 Language &lang;
534 mutable int num;
535 int maxiterations;
536 mutable StringRef m;
537};
538
539class Integer : public Language
540{
541public:
542 Integer() : s(d,20) { }
543 bool Match(const StringRef &ss) const { ref=&ss; return s.Match(ss); }
544 int Num() const
545 {
546 StringRef mr = MatchResult(0);
547 int val=0;
548 std::cout << mr.size() << std::endl;
549 for(int i=0;i<mr.size();i++)
550 {
551 val+=mr[i]-'0';
552 val*=10;
553 }
554 val/=10;
555 return val;
556 }
557 virtual int MatchResultCount() const { return s.MatchResultCount(); }
558 virtual StringRef MatchResult(int i) const
559 {
560 return s.MatchResult(i);
561 }
562 virtual std::string Alphabet() const
563 {
564 return s.Alphabet();
565 }
566private:
567 Digit d;
568 StarLanguage s;
569 mutable const StringRef *ref;
570};
571
573{
574public:
575 ArrayLanguage(Language &lang, Language &separator) : lang(lang), sep(separator), comp(lang, sep), star(comp, 20), comp2(star, lang)
576 {
577 }
578 virtual std::string Alphabet() const
579 {
580 std::string s;
581 s+=lang.Alphabet();
582 s+=sep.Alphabet();
583 std::sort(s.begin(), s.end());
584 std::unique(s.begin(), s.end());
585 return s;
586 }
587
588 virtual bool Match(const StringRef &s) const
589 {
590 return comp2.Match(s);
591 }
592
593 virtual int MatchResultCount() const
594 {
595 return comp2.MatchResultCount();
596 }
597 virtual StringRef MatchResult(int i) const
598 {
599 return comp2.MatchResult(i);
600 }
601
602private:
603 Language &lang;
604 Language &sep;
605 ComposeLanguage comp;
606 StarLanguage star;
607 ComposeLanguage comp2;
608};
609
610// state and event are enums.
611template<class State, class Event>
613{
614public:
615 virtual int NumStates() const = 0;
616 virtual State Initial() const = 0;
617 virtual bool Valid(State state, Event event) const=0;
618 virtual State Transition(State state, Event event) const = 0;
619 virtual bool IsFinal(State state) const = 0;
620};
621
622class CharStateMachine : public StateMachine<int, char>
623{
624public:
625 CharStateMachine(char c) : c(c) { }
626 int NumStates() const { return 2; }
627 int Initial() const { return 0; }
628 bool Valid(int state, char e) const
629 {
630 if (e==c && state == 0)
631 return true;
632 return false;
633 }
634 int Transition(int state, char e) const
635 {
636 if (e==c && state==0) return 1;
637 return 0;
638 }
639 bool IsFinal(int state) const
640 {
641 if (state==1) return true;
642 return false;
643 }
644private:
645 char c;
646};
647
648template<class Event>
649class ConcatStateMachine : public StateMachine<int, Event>
650{
651public:
654 : sm1(sm1), sm2(sm2) { }
655 int NumStates() const { return sm1.NumStates()+sm2.NumStates(); }
656 int Initial() const { return sm1.Initial(); }
657 bool Valid(int state, Event event) const
658 {
659 int i = sm1.NumStates();
660 if (state < i)
661 { // still in sm1
662 if (sm1.IsFinal(state))
663 {
664 return sm2.Valid(sm2.Initial(), event);
665 }
666 else
667 {
668 return sm1.Valid(state, event);
669 }
670 }
671 else
672 {
673 return sm2.Valid(state-i, event);
674 }
675 }
676 int Transition(int state, Event event) const
677 {
678 int i = sm1.NumStates();
679 if (state < i)
680 { // still in sm1
681 if (sm1.IsFinal(state))
682 { // move to sm2
683 return i+sm2.Transition(sm2.Initial(), event);
684 }
685 else
686 {
687 return sm1.Transition(state, event);
688 }
689 }
690 else
691 { // in sm2
692 return i+sm2.Transition(state-i, event);
693 }
694 }
695 bool IsFinal(int state) const
696 {
697 int i = sm1.NumStates();
698 if (state < i) return false;
699 if (sm2.IsFinal(state-i)) return true;
700 return false;
701 }
702private:
705};
706
707template<class Event>
708class UnionStateMachine : public StateMachine<int,Event>
709{
710public:
713 : sm1(sm1), sm2(sm2) { }
714 int NumStates() const
715 {
716 return sm1.NumStates()+sm2.NumStates()+1;
717 }
718 int Initial() const
719 {
720 return 0;
721 }
722 bool Valid(int state, Event event) const
723 {
724 if (state==0)
725 {
726 if (sm1.Valid(state, event)) return sm1.Valid(state,event);
727 if (sm2.Valid(state, event)) return sm2.Valid(state,event);
728 return false;
729 }
730 else
731 {
732 int i = sm1.NumStates();
733 if (state < i+1)
734 {
735 return sm1.Valid(state-1, event);
736 }
737 else
738 {
739 return sm2.Valid(state-i-1, event);
740 }
741 }
742 }
743 int Transition(int state, Event event) const
744 {
745 if (state==0)
746 {
747 if (sm1.Valid(state,event)) return sm1.Transition(state,event);
748 if (sm2.Valid(state,event)) return sm2.Transition(state,event);
749 return 0;
750 }
751 else
752 {
753 int i = sm1.NumStates();
754 if (state < i+1)
755 {
756 return 1+sm1.Transition(state-1,event);
757 }
758 else
759 {
760 return i+1+sm2.Transition(state-i-1, event);
761 }
762 }
763 }
764 bool IsFinal(int state) const
765 {
766 int i = sm1.NumStates();
767 if (state==0)
768 {
769 return false;
770 }
771 else if (state < i+1)
772 {
773 return sm1.IsFinal(state-1);
774 }
775 else
776 {
777 return sm2.IsFinal(state-i-1);
778 }
779 }
780
781private:
784};
785
786template<class State, class Event>
788{
789public:
790 virtual State AddState() = 0;
791 virtual void AddTransition(State state_a, State state_b, Event event) = 0;
792 virtual void MarkFinal(State state) = 0;
793 virtual void ChangeInitial(State state) = 0;
794};
795
796template<class State, class Event>
798{
799public:
800 StateMachineState(StateMachine<State,Event> &sm) : current_state(sm.Initial()), sm(sm) {}
801 void Reset() { current_state = sm.Initial(); }
802 bool ValidEvent(Event event) const
803 {
804 return sm.Valid(current_state, event);
805 }
806 void SendEvent(Event event)
807 {
808 current_state = sm.Transition(current_state, event);
809 }
810 bool Final() const { return sm.IsFinal(current_state); }
811private:
812 State current_state;
814};
815
817{
818public:
819 StateMachineLanguage(StateMachine<int, char> &sm, const std::vector<char> &events) : sm(sm), events(events) { }
820 virtual std::string Alphabet() const
821 {
822 return std::string(events.begin(), events.end());
823 }
824 virtual bool Match(const StringRef &s) const
825 {
827 for(int i=0;i<s.size();i++)
828 {
829 state.SendEvent(s[i]);
830 }
831 return state.Final();
832 }
833
834 virtual int MatchResultCount() const { return 0; }
835 virtual StringRef MatchResult(int i) const { return StringRef(""); }
836
837private:
839 std::vector<char> events;
840};
841
842
843//
844//
845// PROPER STATE MACHINE
846//
847//
848
849struct State
850{
851public:
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); }
854 void SetFinal(bool f) { final = f; }
855 void SetStartGroup(bool b) { startgroup = b; }
856 void SetEndGroup(bool b) { endgroup = b; }
857public:
858 bool IsStartGroup(char /*cc*/) const
859 {
860 int size = link_events.size();
861 for(int i=0;i<size;i++)
862 {
863 char c = link_events[i];
864 if (c=='@') {
865 bool b = links[i]->IsStartGroup('*');
866 if (b) return true;
867 }
868 //if (c==cc) return startgroup;
869 }
870 return startgroup;
871 }
872 bool IsEndGroup(char /*cc*/) const
873 {
874 int size = link_events.size();
875 for(int i=0;i<size;i++)
876 {
877 char c = link_events[i];
878 if (c=='@') {
879 bool b = links[i]->IsEndGroup('*');
880 if (b) return true;
881 }
882 //if (c==cc) return endgroup;
883 }
884 return endgroup;
885
886 }
887 bool IsFinal() const
888 {
889 int size = link_events.size();
890 for(int i=0;i<size;i++)
891 {
892 char c = link_events[i];
893 if (c=='@') {
894 bool b = links[i]->IsFinal();
895 if (b) return true;
896 }
897 }
898 return final;
899 }
900 std::vector<char> Lookup() const
901 {
902 std::vector<char> res;
903 int size = link_events.size();
904 for(int i=0;i<size;i++)
905 {
906 char c = link_events[i];
907 if (c=='@') {
908 std::vector<char> cc = links[i]->Lookup();
909 int size = cc.size();
910 for(int k=0;k<size;k++)
911 {
912 res.push_back(cc[k]);
913 }
914 } else {
915 res.push_back(c);
916 }
917 }
918 return res;
919 }
920 State *Follow(char ca) const
921 {
922 int size = link_events.size();
923 for(int i=0;i<size;i++)
924 {
925 char c = link_events[i];
926 if (c=='@') {
927 State *st = links[i]->Follow(ca);
928 if (st) return st;
929 }
930 if (c==ca) return links[i];
931 }
932 return 0;
933 }
934private:
935 std::vector<State*> links;
936 std::vector<char> link_events;
937 bool final;
938 bool startgroup;
939 bool endgroup;
940};
941
942typedef std::pair<State*, State*> SM;
943
944
946{
947 State *first = new State;
948 State *second = new State;
949 first->AddLink(c, second);
950 return std::make_pair(first, second);
951}
952
954{
955 p1.second->AddLink('@', p2.first);
956 return std::make_pair(p1.first, p2.second);
957}
958
960{
961 p1.second->AddLink('@', p1.first);
962 return std::make_pair(p1.first, p1.second);
963}
964
965SM Or(SM p1, SM p2)
966{
967 State *first = new State;
968 first->AddLink('@', p1.first);
969 first->AddLink('@', p2.first);
970
971 State *last = new State;
972 p1.second->AddLink('@', last);
973 p2.second->AddLink('@', last);
974 return std::make_pair(first,last);
975}
976
977SM String(std::string s)
978{
979 if (s.size()==0)
980 {
981 State *first = new State;
982 return std::make_pair(first,first);
983 }
984 char c = s[0];
985 SM csm = CharacterMatch(c);
986 int size = s.size();
987 for(int i=1;i<size;i++)
988 {
989 SM a = CharacterMatch(s[i]);
990 csm = Concatenation(csm,a);
991 }
992 return csm;
993}
994
996{
997 State *startgroup = new State;
998 startgroup->SetStartGroup(true);
999 startgroup->AddLink('@', s.first);
1000 State *endgroup = new State;
1001 endgroup->SetEndGroup(true);
1002 s.second->AddLink('@', endgroup);
1003 return std::make_pair(startgroup, endgroup);
1004}
1005
1006SM Any(std::vector<char> alphabet)
1007{
1008 if (alphabet.size()==0)
1009 {
1010 State *first = new State;
1011 return std::make_pair(first,first);
1012 }
1013 char c = alphabet[0];
1014 SM csm = CharacterMatch(c);
1015 int size = alphabet.size();
1016 for(int i=1;i<size;i++)
1017 {
1018 SM a = CharacterMatch(alphabet[i]);
1019 csm = Or(csm,a);
1020 }
1021 return csm;
1022}
1023
1024int find(const std::vector<char> &c, char cc)
1025{
1026 int s = c.size();
1027 for(int i=0;i<s;i++)
1028 {
1029 if (c[i]==cc) return i;
1030 }
1031 return -1;
1032}
1033
1034SM Not(std::vector<char> alphabet, std::vector<char> not_included)
1035{
1036 if (alphabet.size()==0)
1037 {
1038 State *first = new State;
1039 return std::make_pair(first,first);
1040 }
1041 char c = alphabet[0];
1042 SM csm = CharacterMatch(c);
1043 int size = alphabet.size();
1044 for(int i=1;i<size;i++)
1045 {
1046 if (find(not_included, alphabet[i]) != -1)
1047 {
1048 continue;
1049 }
1050 SM a = CharacterMatch(alphabet[i]);
1051 csm = Or(csm,a);
1052 }
1053 return csm;
1054}
1056{
1057 s.second->SetFinal(true);
1058 return s;
1059}
1060
1061bool Match(SM sm, const std::string &ss, std::vector<std::string> &res)
1062{
1063 std::vector<std::string> stack;
1064
1065 State *st = sm.first;
1066 if (!st) return false;
1067
1068 int sz = ss.size();
1069 for(int i=0;i<sz;i++)
1070 {
1071 //std::cout << "Loop count: " << i << std::endl;
1072 if (st->IsStartGroup(ss[i]))
1073 {
1074 //std::cout << "STARTGROUP" << std::endl;
1075 stack.push_back("");
1076 }
1077 if (stack.size())
1078 {
1079 //std::cout << "Inserting: " << ss[i] << std::endl;
1080 stack[stack.size()-1]+=ss[i];
1081 }
1082 st = st->Follow(ss[i]);
1083 if (st->IsEndGroup(ss[i]))
1084 {
1085 //std::cout << "ENDGROUP" << std::endl;
1086 res.push_back(stack.back());
1087 stack.pop_back();
1088 }
1089 if (!st) return false;
1090
1091 }
1092
1093 if (st->IsFinal()) return true;
1094 return false;
1095}
1096
1097//
1098// Tests
1099//
1101{
1102 SM s = String("abcdef");
1103 SM st = Repeat(s);
1104 SM ss = String("ppppp");
1105 SM s2 = Grouping(st);
1106 SM ss2 = Grouping(ss);
1107 SM sc = Concatenation(s2,ss2);
1108 SM s3 = Final(sc);
1109 std::vector<std::string> res;
1110 bool b = Match(s3, "abcdefabcdefppppp", res);
1111 if (b)
1112 std::cout << "MATCH!" << std::endl;
1113 int size = res.size();
1114 for(int i=0;i<size;i++)
1115 {
1116 std::cout << "P " << res[i] << std::endl;
1117 }
1118}
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 EffectI.hh:22
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
Definition Monoid.hh:4
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
not_this_one end(...)
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
Definition GameApi.h:84
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