ruco-cpp 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 938f24b2c00ffbe663d224f8a4bdc7e83ffd1399
4
+ data.tar.gz: f90f9b5745a5366f5094fe1ecffa697429204e1c
5
+ SHA512:
6
+ metadata.gz: c9bf140c850998e1cfa9e4bde933861ce4cf30f84c3ed7ecfdb0a433d526d2ab359578e244eb86b1839b54fcaed3855c3487653b5db937e394aab2203faffdff
7
+ data.tar.gz: 80b235765f865e55b913c40ef547895d521d31382a6ff28dca478713ac866b5802bcea22f05bc7ae91f0af8bb33c34f0bf8bf898807a629e3454fa83ba659033
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require "rake/extensiontask"
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ gemspec = Gem::Specification.load('ruco.gemspec')
8
+ Rake::ExtensionTask.new do |ext|
9
+ ext.name = 'cocor'
10
+ ext.ext_dir = 'ext/cocor'
11
+ ext.lib_dir = 'lib/cocor'
12
+ ext.gem_spec = gemspec
13
+ ext.source_pattern = "*.{c,cpp}"
14
+ end
15
+
16
+ task :default => [:test]
17
+ task :test => [:compile, :spec]
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ruco"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/ruco ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "ruco"
4
+ require "cocor"
5
+ require "fileutils"
6
+
7
+ if ARGV.length < 1
8
+ puts "Usage: ruco <grammar.ruco> [Grammar Name]"
9
+ exit 1
10
+ end
11
+
12
+ file = ARGV[0]
13
+ grammar_name = File.basename file, ".ruco"
14
+ grammar_name = ARGV[1] if ARGV[1]
15
+
16
+ rr = Ruco::Ruco.new grammar_name.capitalize do
17
+ instance_eval(File.read(file), file)
18
+ end
19
+
20
+ File.write("#{grammar_name}.atg",rr.generate_atg)
21
+ File.write("#{grammar_name}.hpp",rr.generate_header)
22
+ File.write("parse_#{grammar_name}.cpp",rr.generate_libcpp)
23
+ File.write("parse_#{grammar_name}.hpp",rr.generate_libhpp)
24
+ FileUtils.cp(File.join(Gem.datadir("ruco"), "picojson", "picojson.h"),"picojson.hpp")
25
+
26
+ atg = File.join(Dir.pwd, "#{grammar_name}.atg")
27
+ datadir = Gem.datadir "ruco"
28
+ puts atg
29
+
30
+ Cocor.compile atg, datadir, grammar_name.capitalize, "#{Dir.pwd}/"
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,359 @@
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
+ /*----------------------------------------------------------------------
30
+ Parser.h Specification
31
+ -----------------------------------------------------------------------*/
32
+
33
+ -->begin
34
+
35
+ #if !defined(-->prefixCOCO_PARSER_H__)
36
+ #define -->prefixCOCO_PARSER_H__
37
+
38
+ -->headerdef
39
+
40
+ #include "Scanner.h"
41
+
42
+ -->namespace_open
43
+
44
+ class ParserException {
45
+
46
+ int line,col;
47
+ std::wstring message;
48
+
49
+ public:
50
+ ParserException(int line, int col, std::wstring message) :
51
+ line(line), col(col), message(message)
52
+ {
53
+ }
54
+
55
+ int LineNumber() const
56
+ {
57
+ return line;
58
+ }
59
+
60
+ int ColumnNumber() const
61
+ {
62
+ return col;
63
+ }
64
+
65
+ std::wstring GetMessage() const
66
+ {
67
+ return message;
68
+ }
69
+ };
70
+
71
+ class Errors {
72
+ public:
73
+ int count; // number of errors detected
74
+ std::vector<ParserException> warnings;
75
+
76
+ Errors();
77
+ void SynErr(int line, int col, int n);
78
+ void Error(int line, int col, const wchar_t *s);
79
+ void Warning(int line, int col, const wchar_t *s);
80
+ void Warning(const wchar_t *s);
81
+ void Exception(const wchar_t *s);
82
+
83
+ }; // Errors
84
+
85
+ class Parser {
86
+ private:
87
+ -->constantsheader
88
+ Token *dummyToken;
89
+ int errDist;
90
+ int minErrDist;
91
+
92
+ void SynErr(int n);
93
+ void Get();
94
+ void Expect(int n);
95
+ bool StartOf(int s);
96
+ void ExpectWeak(int n, int follow);
97
+ bool WeakSeparator(int n, int syFol, int repFol);
98
+
99
+ public:
100
+ Scanner *scanner;
101
+ Errors *errors;
102
+
103
+ Token *t; // last recognized token
104
+ Token *la; // lookahead token
105
+
106
+ -->declarations
107
+
108
+ Parser(Scanner *scanner);
109
+ ~Parser();
110
+ void SemErr(const wchar_t* msg);
111
+
112
+ -->productionsheader
113
+ void Parse();
114
+
115
+ }; // end Parser
116
+
117
+ -->namespace_close
118
+
119
+ #endif
120
+
121
+ -->implementation
122
+
123
+ /*----------------------------------------------------------------------
124
+ Parser.cpp Specification
125
+ -----------------------------------------------------------------------*/
126
+
127
+ -->begin
128
+
129
+ #include <wchar.h>
130
+ #include "Parser.h"
131
+ #include "Scanner.h"
132
+
133
+
134
+ -->namespace_open
135
+
136
+ void Parser::SynErr(int n) {
137
+ if (errDist >= minErrDist) errors->SynErr(la->line, la->col, n);
138
+ errDist = 0;
139
+ }
140
+
141
+ void Parser::SemErr(const wchar_t* msg) {
142
+ if (errDist >= minErrDist) errors->Error(t->line, t->col, msg);
143
+ errDist = 0;
144
+ }
145
+
146
+ void Parser::Get() {
147
+ for (;;) {
148
+ t = la;
149
+ la = scanner->Scan();
150
+ if (la->kind <= maxT) { ++errDist; break; }
151
+ -->pragmas
152
+ if (dummyToken != t) {
153
+ dummyToken->kind = t->kind;
154
+ dummyToken->pos = t->pos;
155
+ dummyToken->col = t->col;
156
+ dummyToken->line = t->line;
157
+ dummyToken->next = NULL;
158
+ coco_string_delete(dummyToken->val);
159
+ dummyToken->val = coco_string_create(t->val);
160
+ t = dummyToken;
161
+ }
162
+ la = t;
163
+ }
164
+ }
165
+
166
+ void Parser::Expect(int n) {
167
+ if (la->kind==n) Get(); else { SynErr(n); }
168
+ }
169
+
170
+ void Parser::ExpectWeak(int n, int follow) {
171
+ if (la->kind == n) Get();
172
+ else {
173
+ SynErr(n);
174
+ while (!StartOf(follow)) Get();
175
+ }
176
+ }
177
+
178
+ bool Parser::WeakSeparator(int n, int syFol, int repFol) {
179
+ if (la->kind == n) {Get(); return true;}
180
+ else if (StartOf(repFol)) {return false;}
181
+ else {
182
+ SynErr(n);
183
+ while (!(StartOf(syFol) || StartOf(repFol) || StartOf(0))) {
184
+ Get();
185
+ }
186
+ return StartOf(syFol);
187
+ }
188
+ }
189
+
190
+ -->productions
191
+
192
+
193
+ // If the user declared a method Init and a mehtod Destroy they should
194
+ // be called in the contructur and the destructor respctively.
195
+ //
196
+ // The following templates are used to recognize if the user declared
197
+ // the methods Init and Destroy.
198
+
199
+ template<typename T>
200
+ struct ParserInitExistsRecognizer {
201
+ template<typename U, void (U::*)() = &U::Init>
202
+ struct ExistsIfInitIsDefinedMarker{};
203
+
204
+ struct InitIsMissingType {
205
+ char dummy1;
206
+ };
207
+
208
+ struct InitExistsType {
209
+ char dummy1; char dummy2;
210
+ };
211
+
212
+ // exists always
213
+ template<typename U>
214
+ static InitIsMissingType is_here(...);
215
+
216
+ // exist only if ExistsIfInitIsDefinedMarker is defined
217
+ template<typename U>
218
+ static InitExistsType is_here(ExistsIfInitIsDefinedMarker<U>*);
219
+
220
+ enum { InitExists = (sizeof(is_here<T>(NULL)) == sizeof(InitExistsType)) };
221
+ };
222
+
223
+ template<typename T>
224
+ struct ParserDestroyExistsRecognizer {
225
+ template<typename U, void (U::*)() = &U::Destroy>
226
+ struct ExistsIfDestroyIsDefinedMarker{};
227
+
228
+ struct DestroyIsMissingType {
229
+ char dummy1;
230
+ };
231
+
232
+ struct DestroyExistsType {
233
+ char dummy1; char dummy2;
234
+ };
235
+
236
+ // exists always
237
+ template<typename U>
238
+ static DestroyIsMissingType is_here(...);
239
+
240
+ // exist only if ExistsIfDestroyIsDefinedMarker is defined
241
+ template<typename U>
242
+ static DestroyExistsType is_here(ExistsIfDestroyIsDefinedMarker<U>*);
243
+
244
+ enum { DestroyExists = (sizeof(is_here<T>(NULL)) == sizeof(DestroyExistsType)) };
245
+ };
246
+
247
+ // The folloing templates are used to call the Init and Destroy methods if they exist.
248
+
249
+ // Generic case of the ParserInitCaller, gets used if the Init method is missing
250
+ template<typename T, bool = ParserInitExistsRecognizer<T>::InitExists>
251
+ struct ParserInitCaller {
252
+ static void CallInit(T *t) {
253
+ // nothing to do
254
+ }
255
+ };
256
+
257
+ // True case of the ParserInitCaller, gets used if the Init method exists
258
+ template<typename T>
259
+ struct ParserInitCaller<T, true> {
260
+ static void CallInit(T *t) {
261
+ t->Init();
262
+ }
263
+ };
264
+
265
+ // Generic case of the ParserDestroyCaller, gets used if the Destroy method is missing
266
+ template<typename T, bool = ParserDestroyExistsRecognizer<T>::DestroyExists>
267
+ struct ParserDestroyCaller {
268
+ static void CallDestroy(T *t) {
269
+ // nothing to do
270
+ }
271
+ };
272
+
273
+ // True case of the ParserDestroyCaller, gets used if the Destroy method exists
274
+ template<typename T>
275
+ struct ParserDestroyCaller<T, true> {
276
+ static void CallDestroy(T *t) {
277
+ t->Destroy();
278
+ }
279
+ };
280
+
281
+ void Parser::Parse() {
282
+ t = NULL;
283
+ la = dummyToken = new Token();
284
+ la->val = coco_string_create(L"Dummy Token");
285
+ Get();
286
+ -->parseRoot
287
+ }
288
+
289
+ Parser::Parser(Scanner *scanner) {
290
+ -->constants
291
+ ParserInitCaller<Parser>::CallInit(this);
292
+ dummyToken = NULL;
293
+ t = la = NULL;
294
+ minErrDist = 2;
295
+ errDist = minErrDist;
296
+ this->scanner = scanner;
297
+ errors = new Errors();
298
+ }
299
+
300
+ bool Parser::StartOf(int s) {
301
+ const bool T = true;
302
+ const bool x = false;
303
+
304
+ -->initialization
305
+
306
+ return set[s][la->kind];
307
+ }
308
+
309
+ Parser::~Parser() {
310
+ ParserDestroyCaller<Parser>::CallDestroy(this);
311
+ delete errors;
312
+ delete dummyToken;
313
+ }
314
+
315
+ Errors::Errors() {
316
+ count = 0;
317
+ }
318
+
319
+ void Errors::SynErr(int line, int col, int n) {
320
+ wchar_t* s;
321
+ switch (n) {
322
+ -->errors
323
+ default:
324
+ {
325
+ wchar_t format[20];
326
+ coco_swprintf(format, 20, L"error %d", n);
327
+ s = coco_string_create(format);
328
+ }
329
+ break;
330
+ }
331
+ throw ParserException(line, col, s);
332
+ //wprintf(L"-- line %d col %d: %ls\n", line, col, s);
333
+ coco_string_delete(s);
334
+ count++;
335
+ }
336
+
337
+ void Errors::Error(int line, int col, const wchar_t *s) {
338
+ throw ParserException(line, col, s);
339
+ //wprintf(L"-- line %d col %d: %ls\n", line, col, s);
340
+ count++;
341
+ }
342
+
343
+ void Errors::Warning(int line, int col, const wchar_t *s) {
344
+ warnings.push_back(ParserException(line, col, s));
345
+ //wprintf(L"-- line %d col %d: %ls\n", line, col, s);
346
+ }
347
+
348
+ void Errors::Warning(const wchar_t *s) {
349
+ warnings.push_back(ParserException(0, 0, s));
350
+ //wprintf(L"%ls\n", s);
351
+ }
352
+
353
+ void Errors::Exception(const wchar_t* s) {
354
+ throw ParserException(0, 0, s);
355
+ //wprintf(L"%ls", s);
356
+ exit(1);
357
+ }
358
+
359
+ -->namespace_close