ruco-cpp 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +17 -0
  3. data/bin/console +14 -0
  4. data/bin/ruco +30 -0
  5. data/bin/setup +7 -0
  6. data/data/ruco/Parser.frame +359 -0
  7. data/data/ruco/Scanner.frame +896 -0
  8. data/data/ruco/picojson/Changes +14 -0
  9. data/data/ruco/picojson/LICENSE +25 -0
  10. data/data/ruco/picojson/Makefile +8 -0
  11. data/data/ruco/picojson/README.mkdn +183 -0
  12. data/data/ruco/picojson/examples/github-issues.cc +110 -0
  13. data/data/ruco/picojson/examples/iostream.cc +70 -0
  14. data/data/ruco/picojson/examples/streaming.cc +76 -0
  15. data/data/ruco/picojson/picojson.h +1299 -0
  16. data/ext/cocor/Action.cpp +81 -0
  17. data/ext/cocor/Action.h +59 -0
  18. data/ext/cocor/ArrayList.cpp +79 -0
  19. data/ext/cocor/ArrayList.h +52 -0
  20. data/ext/cocor/BitArray.cpp +156 -0
  21. data/ext/cocor/BitArray.h +68 -0
  22. data/ext/cocor/CharClass.cpp +42 -0
  23. data/ext/cocor/CharClass.h +48 -0
  24. data/ext/cocor/CharSet.cpp +166 -0
  25. data/ext/cocor/CharSet.h +68 -0
  26. data/ext/cocor/Coco.atg +528 -0
  27. data/ext/cocor/Coco.cpp +173 -0
  28. data/ext/cocor/Comment.cpp +45 -0
  29. data/ext/cocor/Comment.h +51 -0
  30. data/ext/cocor/Copyright.frame +27 -0
  31. data/ext/cocor/DFA.cpp +865 -0
  32. data/ext/cocor/DFA.h +132 -0
  33. data/ext/cocor/Generator.cpp +182 -0
  34. data/ext/cocor/Generator.h +61 -0
  35. data/ext/cocor/Graph.h +59 -0
  36. data/ext/cocor/HashTable.cpp +115 -0
  37. data/ext/cocor/HashTable.h +84 -0
  38. data/ext/cocor/Makefile +11 -0
  39. data/ext/cocor/Melted.cpp +39 -0
  40. data/ext/cocor/Melted.h +51 -0
  41. data/ext/cocor/Node.cpp +69 -0
  42. data/ext/cocor/Node.h +86 -0
  43. data/ext/cocor/Parser.cpp +925 -0
  44. data/ext/cocor/Parser.frame +326 -0
  45. data/ext/cocor/Parser.h +153 -0
  46. data/ext/cocor/ParserGen.cpp +486 -0
  47. data/ext/cocor/ParserGen.h +99 -0
  48. data/ext/cocor/Position.cpp +37 -0
  49. data/ext/cocor/Position.h +46 -0
  50. data/ext/cocor/README.md +12 -0
  51. data/ext/cocor/Scanner.cpp +833 -0
  52. data/ext/cocor/Scanner.frame +897 -0
  53. data/ext/cocor/Scanner.h +291 -0
  54. data/ext/cocor/Sets.h +84 -0
  55. data/ext/cocor/SortedList.cpp +141 -0
  56. data/ext/cocor/SortedList.h +68 -0
  57. data/ext/cocor/State.cpp +77 -0
  58. data/ext/cocor/State.h +55 -0
  59. data/ext/cocor/StringBuilder.cpp +88 -0
  60. data/ext/cocor/StringBuilder.h +29 -0
  61. data/ext/cocor/Symbol.cpp +61 -0
  62. data/ext/cocor/Symbol.h +70 -0
  63. data/ext/cocor/Tab.cpp +1248 -0
  64. data/ext/cocor/Tab.h +245 -0
  65. data/ext/cocor/Target.cpp +41 -0
  66. data/ext/cocor/Target.h +48 -0
  67. data/ext/cocor/build.bat +3 -0
  68. data/ext/cocor/build.sh +4 -0
  69. data/ext/cocor/coc.bat +1 -0
  70. data/ext/cocor/coc.sh +2 -0
  71. data/ext/cocor/cocor_ruby_ext.cpp +124 -0
  72. data/ext/cocor/cygBuild.bat +1 -0
  73. data/ext/cocor/extconf.rb +5 -0
  74. data/ext/cocor/mingwbuild.bat +2 -0
  75. data/ext/cocor/mkmf.log +57 -0
  76. data/ext/cocor/zipsources.bat +1 -0
  77. data/lib/cocor.rb +14 -0
  78. data/lib/ruco/version.rb +3 -0
  79. data/lib/ruco.rb +728 -0
  80. metadata +195 -0
data/ext/cocor/DFA.h ADDED
@@ -0,0 +1,132 @@
1
+ /*-------------------------------------------------------------------------
2
+ DFA -- Generation of the Scanner Automaton
3
+ Compiler Generator Coco/R,
4
+ Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
5
+ extended by M. Loeberbauer & A. Woess, Univ. of Linz
6
+ ported to C++ by Csaba Balazs, University of Szeged
7
+ with improvements by Pat Terry, Rhodes University
8
+
9
+ This program is free software; you can redistribute it and/or modify it
10
+ under the terms of the GNU General Public License as published by the
11
+ Free Software Foundation; either version 2, or (at your option) any
12
+ later version.
13
+
14
+ This program is distributed in the hope that it will be useful, but
15
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17
+ for more details.
18
+
19
+ You should have received a copy of the GNU General Public License along
20
+ with this program; if not, write to the Free Software Foundation, Inc.,
21
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
+
23
+ As an exception, it is allowed to write an extension of Coco/R that is
24
+ used as a plugin in non-free software.
25
+
26
+ If not otherwise stated, any source code generated by Coco/R (other than
27
+ Coco/R itself) does not fall under the GNU General Public License.
28
+ -------------------------------------------------------------------------*/
29
+
30
+ #if !defined(COCO_DFA_H__)
31
+ #define COCO_DFA_H__
32
+
33
+ #include <stddef.h>
34
+ #include "Action.h"
35
+ #include "Comment.h"
36
+ #include "State.h"
37
+ #include "Symbol.h"
38
+ #include "Melted.h"
39
+ #include "Node.h"
40
+ #include "Target.h"
41
+
42
+ namespace Coco {
43
+
44
+
45
+ class Parser;
46
+ class Tab;
47
+ class BitArray;
48
+
49
+ class DFA
50
+ {
51
+ public:
52
+ int maxStates;
53
+ int lastStateNr; // highest state number
54
+ State *firstState;
55
+ State *lastState; // last allocated state
56
+ int lastSimState; // last non melted state
57
+ FILE* fram; // scanner frame input
58
+ FILE* gen; // generated scanner file
59
+ Symbol *curSy; // current token to be recognized (in FindTrans)
60
+ Node *curGraph; // start of graph for current token (in FindTrans)
61
+ bool ignoreCase; // true if input should be treated case-insensitively
62
+ bool dirtyDFA; // DFA may become nondeterministic in MatchLiteral
63
+ bool hasCtxMoves; // DFA has context transitions
64
+ bool *existLabel; // checking the Labels (in order to avoid the warning messages)
65
+
66
+ Parser *parser; // other Coco objects
67
+ Tab *tab;
68
+ Errors *errors;
69
+ FILE* trace;
70
+
71
+ Melted *firstMelted; // head of melted state list
72
+ Comment *firstComment; // list of comments
73
+
74
+ //---------- Output primitives
75
+ wchar_t* Ch(wchar_t ch);
76
+ wchar_t* ChCond(wchar_t ch);
77
+ void PutRange(CharSet *s);
78
+
79
+ //---------- State handling
80
+ State* NewState();
81
+ void NewTransition(State *from, State *to, int typ, int sym, int tc);
82
+ void CombineShifts();
83
+ void FindUsedStates(State *state, BitArray *used);
84
+ void DeleteRedundantStates();
85
+ State* TheState(Node *p);
86
+ void Step(State *from, Node *p, BitArray *stepped);
87
+ void NumberNodes(Node *p, State *state, bool renumIter);
88
+ void FindTrans (Node *p, bool start, BitArray *marked);
89
+ void ConvertToStates(Node *p, Symbol *sym);
90
+ // match string against current automaton; store it either as a fixedToken or as a litToken
91
+ void MatchLiteral(wchar_t* s, Symbol *sym);
92
+ void SplitActions(State *state, Action *a, Action *b);
93
+ bool Overlap(Action *a, Action *b);
94
+ bool MakeUnique(State *state); // return true if actions were split
95
+ void MeltStates(State *state);
96
+ void FindCtxStates();
97
+ void MakeDeterministic();
98
+ void PrintStates();
99
+ void CheckLabels();
100
+
101
+ //---------------------------- actions --------------------------------
102
+ Action* FindAction(State *state, wchar_t ch);
103
+ void GetTargetStates(Action *a, BitArray* &targets, Symbol* &endOf, bool &ctx);
104
+
105
+ //------------------------- melted states ------------------------------
106
+ Melted* NewMelted(BitArray *set, State *state);
107
+ BitArray* MeltedSet(int nr);
108
+ Melted* StateWithSet(BitArray *s);
109
+
110
+ //------------------------ comments --------------------------------
111
+ wchar_t* CommentStr(Node *p);
112
+ void NewComment(Node *from, Node *to, bool nested);
113
+
114
+ //------------------------ scanner generation ----------------------
115
+ void GenComBody(Comment *com);
116
+ void GenCommentHeader(Comment *com, int i);
117
+ void GenComment(Comment *com, int i);
118
+ void CopyFramePart(const wchar_t* stop);
119
+ wchar_t* SymName(Symbol *sym); // real name value is stored in Tab.literals
120
+ void GenLiterals ();
121
+ int GenNamespaceOpen(const wchar_t* nsName);
122
+ void GenNamespaceClose(int nrOfNs);
123
+ void WriteState(State *state);
124
+ void WriteStartTab();
125
+ void OpenGen(const wchar_t* genName, bool backUp); /* pdt */
126
+ void WriteScanner();
127
+ DFA(Parser *parser);
128
+ };
129
+
130
+ }; // namespace
131
+
132
+ #endif // !defined(COCO_DFA_H__)
@@ -0,0 +1,182 @@
1
+ /*----------------------------------------------------------------------
2
+ Compiler Generator Coco/R,
3
+ Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
4
+ extended by M. Loeberbauer & A. Woess, Univ. of Linz
5
+ ported to C++ by Csaba Balazs, University of Szeged
6
+ with improvements by Pat Terry, Rhodes University
7
+
8
+ This program is free software; you can redistribute it and/or modify it
9
+ under the terms of the GNU General Public License as published by the
10
+ Free Software Foundation; either version 2, or (at your option) any
11
+ later version.
12
+
13
+ This program is distributed in the hope that it will be useful, but
14
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16
+ for more details.
17
+
18
+ You should have received a copy of the GNU General Public License along
19
+ with this program; if not, write to the Free Software Foundation, Inc.,
20
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
+
22
+ As an exception, it is allowed to write an extension of Coco/R that is
23
+ used as a plugin in non-free software.
24
+
25
+ If not otherwise stated, any source code generated by Coco/R (other than
26
+ Coco/R itself) does not fall under the GNU General Public License.
27
+ -----------------------------------------------------------------------*/
28
+
29
+ #include "Generator.h"
30
+ #include "Scanner.h"
31
+
32
+ namespace Coco {
33
+
34
+ Generator::Generator(Tab *tab, Errors *errors) {
35
+ this->errors = errors;
36
+ this->tab = tab;
37
+ fram = NULL;
38
+ gen = NULL;
39
+ frameFile = NULL;
40
+ }
41
+
42
+ FILE* Generator::OpenFrame(const wchar_t* frame) {
43
+ if (coco_string_length(tab->frameDir) != 0) {
44
+ frameFile = coco_string_create_append(tab->frameDir, L"/");
45
+ coco_string_merge(frameFile, frame);
46
+ char *chFrameFile = coco_string_create_char(frameFile);
47
+ fram = fopen(chFrameFile, "r");
48
+ delete [] chFrameFile;
49
+ }
50
+ if (fram == NULL) {
51
+ delete [] frameFile;
52
+ frameFile = coco_string_create_append(tab->srcDir, frame); /* pdt */
53
+ char *chFrameFile = coco_string_create_char(frameFile);
54
+ fram = fopen(chFrameFile, "r");
55
+ delete [] chFrameFile;
56
+ }
57
+ if (fram == NULL) {
58
+ wchar_t *message = coco_string_create_append(L"-- Cannot find : ", frame);
59
+ errors->Exception(message);
60
+ delete [] message;
61
+ }
62
+
63
+ return fram;
64
+ }
65
+
66
+
67
+ FILE* Generator::OpenGen(const wchar_t *genName) { /* pdt */
68
+ wchar_t *fn = coco_string_create_append(tab->outDir, genName); /* pdt */
69
+ char *chFn = coco_string_create_char(fn);
70
+
71
+ if ((gen = fopen(chFn, "r")) != NULL) {
72
+ fclose(gen);
73
+ wchar_t *oldName = coco_string_create_append(fn, L".old");
74
+ char *chOldName = coco_string_create_char(oldName);
75
+ remove(chOldName); rename(chFn, chOldName); // copy with overwrite
76
+ coco_string_delete(chOldName);
77
+ coco_string_delete(oldName);
78
+ }
79
+ if ((gen = fopen(chFn, "w")) == NULL) {
80
+ wchar_t *message = coco_string_create_append(L"-- Cannot generate : ", genName);
81
+ errors->Exception(message);
82
+ delete [] message;
83
+ }
84
+ coco_string_delete(chFn);
85
+ coco_string_delete(fn);
86
+
87
+ return gen;
88
+ }
89
+
90
+
91
+ void Generator::GenCopyright() {
92
+ FILE *file = NULL;
93
+
94
+ if (coco_string_length(tab->frameDir) != 0) {
95
+ wchar_t *copyFr = coco_string_create_append(tab->frameDir, L"/Copyright.frame");
96
+ char *chCopyFr = coco_string_create_char(copyFr);
97
+ file = fopen(chCopyFr, "r");
98
+ delete [] copyFr;
99
+ delete [] chCopyFr;
100
+ }
101
+ if (file == NULL) {
102
+ wchar_t *copyFr = coco_string_create_append(tab->srcDir, L"Copyright.frame");
103
+ char *chCopyFr = coco_string_create_char(copyFr);
104
+ file = fopen(chCopyFr, "r");
105
+ delete [] copyFr;
106
+ delete [] chCopyFr;
107
+ }
108
+ if (file == NULL) {
109
+ return;
110
+ }
111
+
112
+ FILE *scannerFram = fram;
113
+ fram = file;
114
+
115
+ CopyFramePart(NULL);
116
+ fram = scannerFram;
117
+
118
+ fclose(file);
119
+ }
120
+
121
+ void Generator::GenPrefixFromNamespace() {
122
+ const wchar_t *nsName = tab->nsName;
123
+ if (nsName == NULL || coco_string_length(nsName) == 0) {
124
+ return;
125
+ }
126
+ const int len = coco_string_length(nsName);
127
+ int startPos = 0;
128
+ do {
129
+ int curLen = coco_string_indexof(nsName + startPos, COCO_CPP_NAMESPACE_SEPARATOR);
130
+ if (curLen == -1) { curLen = len - startPos; }
131
+ wchar_t *curNs = coco_string_create(nsName, startPos, curLen);
132
+ fwprintf(gen, L"%ls_", curNs);
133
+ coco_string_delete(curNs);
134
+ startPos = startPos + curLen + 1;
135
+ } while (startPos < len);
136
+ }
137
+
138
+ void Generator::SkipFramePart(const wchar_t *stop) {
139
+ CopyFramePart(stop, false);
140
+ }
141
+
142
+ void Generator::CopyFramePart(const wchar_t *stop) {
143
+ CopyFramePart(stop, true);
144
+ }
145
+
146
+ void Generator::CopyFramePart(const wchar_t* stop, bool generateOutput) {
147
+ wchar_t startCh = 0;
148
+ int endOfStopString = 0;
149
+ wchar_t ch = 0;
150
+
151
+ if (stop != NULL) {
152
+ startCh = stop[0];
153
+ endOfStopString = coco_string_length(stop)-1;
154
+ }
155
+
156
+ fwscanf(fram, L"%lc", &ch); // fram.ReadByte();
157
+ while (!feof(fram)) { // ch != EOF
158
+ if (stop != NULL && ch == startCh) {
159
+ int i = 0;
160
+ do {
161
+ if (i == endOfStopString) return; // stop[0..i] found
162
+ fwscanf(fram, L"%lc", &ch); i++;
163
+ } while (ch == stop[i]);
164
+ // stop[0..i-1] found; continue with last read character
165
+ if (generateOutput) {
166
+ wchar_t *subStop = coco_string_create(stop, 0, i);
167
+ fwprintf(gen, L"%ls", subStop);
168
+ coco_string_delete(subStop);
169
+ }
170
+ } else {
171
+ if (generateOutput) { fwprintf(gen, L"%lc", ch); }
172
+ fwscanf(fram, L"%lc", &ch);
173
+ }
174
+ }
175
+ if (stop != NULL) {
176
+ wchar_t *message = coco_string_create_append(L" -- Incomplete or corrupt frame file: ", frameFile);
177
+ errors->Exception(message);
178
+ delete [] message;
179
+ }
180
+ }
181
+
182
+ }
@@ -0,0 +1,61 @@
1
+ /*----------------------------------------------------------------------
2
+ Compiler Generator Coco/R,
3
+ Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
4
+ extended by M. Loeberbauer & A. Woess, Univ. of Linz
5
+ ported to C++ by Csaba Balazs, University of Szeged
6
+ with improvements by Pat Terry, Rhodes University
7
+
8
+ This program is free software; you can redistribute it and/or modify it
9
+ under the terms of the GNU General Public License as published by the
10
+ Free Software Foundation; either version 2, or (at your option) any
11
+ later version.
12
+
13
+ This program is distributed in the hope that it will be useful, but
14
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16
+ for more details.
17
+
18
+ You should have received a copy of the GNU General Public License along
19
+ with this program; if not, write to the Free Software Foundation, Inc.,
20
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
+
22
+ As an exception, it is allowed to write an extension of Coco/R that is
23
+ used as a plugin in non-free software.
24
+
25
+ If not otherwise stated, any source code generated by Coco/R (other than
26
+ Coco/R itself) does not fall under the GNU General Public License.
27
+ -----------------------------------------------------------------------*/
28
+
29
+ #if !defined(COCO_GENERATOR_H__)
30
+ #define COCO_GENERATOR_H__
31
+
32
+ #include <stdio.h>
33
+ #include "Tab.h"
34
+ #include "Parser.h"
35
+
36
+ namespace Coco {
37
+
38
+ class Generator {
39
+ public:
40
+ Generator(Tab *tab, Errors *errors);
41
+ FILE* OpenFrame(const wchar_t* frame);
42
+ FILE* OpenGen(const wchar_t *genName);
43
+ void GenCopyright();
44
+ void GenPrefixFromNamespace();
45
+ void SkipFramePart(const wchar_t *stop);
46
+ void CopyFramePart(const wchar_t *stop);
47
+
48
+ private:
49
+ FILE* fram;
50
+ FILE* gen;
51
+ Tab *tab;
52
+ wchar_t* frameFile;
53
+ Errors *errors;
54
+
55
+ void CopyFramePart(const wchar_t* stop, bool generateOutput);
56
+
57
+ };
58
+
59
+ } // namespace
60
+
61
+ #endif // !defined(COCO_GENERATOR_H__)
data/ext/cocor/Graph.h ADDED
@@ -0,0 +1,59 @@
1
+ /*-------------------------------------------------------------------------
2
+ Compiler Generator Coco/R,
3
+ Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
4
+ extended by M. Loeberbauer & A. Woess, Univ. of Linz
5
+ ported to C++ by Csaba Balazs, University of Szeged
6
+ with improvements by Pat Terry, Rhodes University
7
+
8
+ This program is free software; you can redistribute it and/or modify it
9
+ under the terms of the GNU General Public License as published by the
10
+ Free Software Foundation; either version 2, or (at your option) any
11
+ later version.
12
+
13
+ This program is distributed in the hope that it will be useful, but
14
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16
+ for more details.
17
+
18
+ You should have received a copy of the GNU General Public License along
19
+ with this program; if not, write to the Free Software Foundation, Inc.,
20
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
+
22
+ As an exception, it is allowed to write an extension of Coco/R that is
23
+ used as a plugin in non-free software.
24
+
25
+ If not otherwise stated, any source code generated by Coco/R (other than
26
+ Coco/R itself) does not fall under the GNU General Public License.
27
+ -------------------------------------------------------------------------*/
28
+
29
+ #if !defined(COCO_GRAPH_H__)
30
+ #define COCO_GRAPH_H__
31
+
32
+ #include "Node.h"
33
+
34
+ namespace Coco {
35
+
36
+ class Graph {
37
+ public:
38
+ Node *l; // left end of graph = head
39
+ Node *r; // right end of graph = list of nodes to be linked to successor graph
40
+
41
+ Graph() {
42
+ l = NULL; r = NULL;
43
+ }
44
+
45
+ Graph(Node *left, Node *right) {
46
+ l = left; r = right;
47
+ }
48
+
49
+ Graph(Node *p) {
50
+ l = p; r = p;
51
+ }
52
+
53
+ virtual ~Graph() {
54
+ }
55
+ };
56
+
57
+ }; // namespace
58
+
59
+ #endif // !defined(COCO_GRAPH_H__)
@@ -0,0 +1,115 @@
1
+ /*-------------------------------------------------------------------------
2
+ Compiler Generator Coco/R,
3
+ Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
4
+ extended by M. Loeberbauer & A. Woess, Univ. of Linz
5
+ ported to C++ by Csaba Balazs, University of Szeged
6
+ with improvements by Pat Terry, Rhodes University
7
+
8
+ This program is free software; you can redistribute it and/or modify it
9
+ under the terms of the GNU General Public License as published by the
10
+ Free Software Foundation; either version 2, or (at your option) any
11
+ later version.
12
+
13
+ This program is distributed in the hope that it will be useful, but
14
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16
+ for more details.
17
+
18
+ You should have received a copy of the GNU General Public License along
19
+ with this program; if not, write to the Free Software Foundation, Inc.,
20
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
+
22
+ As an exception, it is allowed to write an extension of Coco/R that is
23
+ used as a plugin in non-free software.
24
+
25
+ If not otherwise stated, any source code generated by Coco/R (other than
26
+ Coco/R itself) does not fall under the GNU General Public License.
27
+ -------------------------------------------------------------------------*/
28
+
29
+ #include <memory.h>
30
+ #include <stdio.h>
31
+ #include "HashTable.h"
32
+ #include "Scanner.h"
33
+
34
+ namespace Coco {
35
+
36
+ HashTable::HashTable(int size) {
37
+ this->size = size;
38
+ data = new Obj*[size];
39
+ memset(data, 0, size * sizeof(Obj*));
40
+ }
41
+
42
+ HashTable::~HashTable() {
43
+ for (int i = 0; i < size; ++i) {
44
+ Obj *o = data[i];
45
+ while (o != NULL) {
46
+ Obj *del = o;
47
+ o = o->next;
48
+ delete del;
49
+ }
50
+ }
51
+ delete[] data;
52
+ data = NULL;
53
+ };
54
+
55
+ HashTable::Obj* HashTable::Get0(wchar_t *key) const {
56
+ int k = coco_string_hash(key) % size;
57
+ HashTable::Obj *o = data[k];
58
+ while (o != NULL && !coco_string_equal(key, o->key)) {
59
+ o = o->next;
60
+ }
61
+ return o;
62
+ }
63
+
64
+ void HashTable::Set(wchar_t *key, void *val) {
65
+ HashTable::Obj *o = Get0(key);
66
+ if (o == NULL) {
67
+ // new entry
68
+ int k = coco_string_hash(key) % size;
69
+ o = new Obj();
70
+ o->key = key;
71
+ o->val = val;
72
+ o->next = data[k];
73
+ data[k] = o;
74
+ } else {
75
+ // exist entry - overwrite
76
+ o->val = val;
77
+ }
78
+ }
79
+
80
+ void* HashTable::Get(wchar_t *key) const {
81
+ HashTable::Obj *o = Get0(key);
82
+ if (o != NULL) {
83
+ return o->val;
84
+ }
85
+ return NULL;
86
+ }
87
+
88
+ Iterator* HashTable::GetIterator() {
89
+ return new HashTable::Iter(this);
90
+ }
91
+
92
+ HashTable::Iter::Iter(HashTable *ht) {
93
+ this->ht = ht;
94
+ this->pos = 0;
95
+ this->cur = NULL;
96
+ }
97
+
98
+ bool HashTable::Iter::HasNext() {
99
+ while (cur == NULL && pos < ht->size) {
100
+ cur = ht->data[pos];
101
+ ++pos;
102
+ }
103
+ return cur != NULL;
104
+ }
105
+
106
+ DictionaryEntry* HashTable::Iter::Next() {
107
+ if (!HasNext()) {
108
+ return NULL;
109
+ }
110
+ Obj *next = cur;
111
+ cur = cur->next;
112
+ return next;
113
+ }
114
+
115
+ }; // namespace
@@ -0,0 +1,84 @@
1
+ /*-------------------------------------------------------------------------
2
+ Compiler Generator Coco/R,
3
+ Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
4
+ extended by M. Loeberbauer & A. Woess, Univ. of Linz
5
+ ported to C++ by Csaba Balazs, University of Szeged
6
+ with improvements by Pat Terry, Rhodes University
7
+
8
+ This program is free software; you can redistribute it and/or modify it
9
+ under the terms of the GNU General Public License as published by the
10
+ Free Software Foundation; either version 2, or (at your option) any
11
+ later version.
12
+
13
+ This program is distributed in the hope that it will be useful, but
14
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16
+ for more details.
17
+
18
+ You should have received a copy of the GNU General Public License along
19
+ with this program; if not, write to the Free Software Foundation, Inc.,
20
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
+
22
+ As an exception, it is allowed to write an extension of Coco/R that is
23
+ used as a plugin in non-free software.
24
+
25
+ If not otherwise stated, any source code generated by Coco/R (other than
26
+ Coco/R itself) does not fall under the GNU General Public License.
27
+ -------------------------------------------------------------------------*/
28
+
29
+ #if !defined(COCO_HASHTABLE_H__)
30
+ #define COCO_HASHTABLE_H__
31
+
32
+ #include <wchar.h>
33
+
34
+ namespace Coco {
35
+
36
+ class DictionaryEntry {
37
+ public:
38
+ wchar_t *key;
39
+ void *val;
40
+ };
41
+
42
+ class Iterator {
43
+ public:
44
+ virtual bool HasNext() = 0;
45
+ virtual DictionaryEntry* Next() = 0;
46
+ };
47
+
48
+ class HashTable
49
+ {
50
+ public:
51
+ HashTable(int size = 128);
52
+ virtual ~HashTable();
53
+
54
+ virtual void Set(wchar_t *key, void *value);
55
+ virtual void* Get(wchar_t *key) const;
56
+ inline void* operator[](wchar_t *key) const { return Get(key); };
57
+ virtual Iterator* GetIterator();
58
+
59
+ private:
60
+ class Obj : public DictionaryEntry {
61
+ public:
62
+ Obj *next;
63
+ };
64
+
65
+ class Iter : public Iterator {
66
+ private:
67
+ HashTable *ht;
68
+ int pos;
69
+ Obj* cur;
70
+
71
+ public:
72
+ Iter(HashTable *ht);
73
+ virtual bool HasNext();
74
+ virtual DictionaryEntry* Next();
75
+ };
76
+
77
+ Obj* Get0(wchar_t *key) const;
78
+ Obj **data;
79
+ int size;
80
+ };
81
+
82
+ }; // namespace
83
+
84
+ #endif // !defined(COCO_HASHTABLE_H__)
@@ -0,0 +1,11 @@
1
+ all:
2
+ g++ *.cpp -o Coco $(CFLAGS)
3
+
4
+ clean:
5
+ rm -f Coco
6
+
7
+ install:
8
+ ln -s /usr/lib/coco-cpp/Coco $(DESTDIR)/usr/bin/cococpp
9
+ install -m 0755 Coco $(DESTDIR)/usr/lib/coco-cpp
10
+ install -m 0644 *frame $(DESTDIR)/usr/share/coco-cpp
11
+
@@ -0,0 +1,39 @@
1
+ /*-------------------------------------------------------------------------
2
+ Compiler Generator Coco/R,
3
+ Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
4
+ extended by M. Loeberbauer & A. Woess, Univ. of Linz
5
+ ported to C++ by Csaba Balazs, University of Szeged
6
+ with improvements by Pat Terry, Rhodes University
7
+
8
+ This program is free software; you can redistribute it and/or modify it
9
+ under the terms of the GNU General Public License as published by the
10
+ Free Software Foundation; either version 2, or (at your option) any
11
+ later version.
12
+
13
+ This program is distributed in the hope that it will be useful, but
14
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16
+ for more details.
17
+
18
+ You should have received a copy of the GNU General Public License along
19
+ with this program; if not, write to the Free Software Foundation, Inc.,
20
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
+
22
+ As an exception, it is allowed to write an extension of Coco/R that is
23
+ used as a plugin in non-free software.
24
+
25
+ If not otherwise stated, any source code generated by Coco/R (other than
26
+ Coco/R itself) does not fall under the GNU General Public License.
27
+ -------------------------------------------------------------------------*/
28
+
29
+ #include "Melted.h"
30
+
31
+ namespace Coco {
32
+
33
+ class BitArray;
34
+
35
+ Melted::Melted(BitArray *set, State *state) {
36
+ this->set = set; this->state = state;
37
+ }
38
+
39
+ }; // namespace