mittens 0.3.0 → 0.3.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -1
- data/README.md +2 -2
- data/Rakefile +12 -5
- data/ext/mittens/extconf.rb +3 -1
- data/lib/mittens/version.rb +1 -1
- data/vendor/snowball/.github/workflows/ci.yml +144 -17
- data/vendor/snowball/.github/workflows/coverage.yml +117 -0
- data/vendor/snowball/.github/workflows/runtime-tests.yml +26 -0
- data/vendor/snowball/.gitignore +33 -7
- data/vendor/snowball/CONTRIBUTING.rst +7 -0
- data/vendor/snowball/COPYING +1 -1
- data/vendor/snowball/GNUmakefile +736 -298
- data/vendor/snowball/NEWS +1394 -7
- data/vendor/snowball/README.rst +8 -8
- data/vendor/snowball/ada/generate/generate.adb +5 -5
- data/vendor/snowball/ada/src/stemmer.adb +177 -188
- data/vendor/snowball/ada/src/stemmer.ads +86 -89
- data/vendor/snowball/ada/src/stemwords.adb +21 -5
- data/vendor/snowball/algorithms/czech.sbl +255 -0
- data/vendor/snowball/algorithms/danish.sbl +22 -10
- data/vendor/snowball/algorithms/english.sbl +7 -4
- data/vendor/snowball/algorithms/esperanto.sbl +6 -7
- data/vendor/snowball/algorithms/estonian.sbl +9 -4
- data/vendor/snowball/algorithms/finnish.sbl +33 -21
- data/vendor/snowball/algorithms/german.sbl +5 -0
- data/vendor/snowball/algorithms/indonesian.sbl +115 -96
- data/vendor/snowball/algorithms/italian.sbl +26 -1
- data/vendor/snowball/algorithms/lithuanian.sbl +13 -13
- data/vendor/snowball/algorithms/norwegian.sbl +17 -6
- data/vendor/snowball/algorithms/persian.sbl +387 -0
- data/vendor/snowball/algorithms/polish.sbl +177 -0
- data/vendor/snowball/algorithms/sesotho.sbl +115 -0
- data/vendor/snowball/algorithms/turkish.sbl +4 -4
- data/vendor/snowball/compiler/analyser.c +2002 -711
- data/vendor/snowball/compiler/driver.c +460 -298
- data/vendor/snowball/compiler/generator.c +439 -1965
- data/vendor/snowball/compiler/generator_ada.c +605 -430
- data/vendor/snowball/compiler/generator_c.c +2227 -0
- data/vendor/snowball/compiler/generator_csharp.c +365 -274
- data/vendor/snowball/compiler/generator_dart.c +1476 -0
- data/vendor/snowball/compiler/generator_go.c +348 -270
- data/vendor/snowball/compiler/generator_java.c +330 -233
- data/vendor/snowball/compiler/generator_js.c +534 -385
- data/vendor/snowball/compiler/generator_pascal.c +361 -320
- data/vendor/snowball/compiler/generator_php.c +1445 -0
- data/vendor/snowball/compiler/generator_python.c +399 -299
- data/vendor/snowball/compiler/generator_rust.c +370 -261
- data/vendor/snowball/compiler/generator_zig.c +1474 -0
- data/vendor/snowball/compiler/header.h +153 -86
- data/vendor/snowball/compiler/space.c +121 -63
- data/vendor/snowball/compiler/tokeniser.c +286 -182
- data/vendor/snowball/compiler/tokens.h +71 -0
- data/vendor/snowball/csharp/Snowball/Among.cs +14 -26
- data/vendor/snowball/csharp/Snowball/AssemblyInfo.cs +3 -3
- data/vendor/snowball/csharp/Snowball/Stemmer.cs +41 -45
- data/vendor/snowball/csharp/Stemwords/Program.cs +20 -14
- data/vendor/snowball/cxx/.gitignore +4 -0
- data/vendor/snowball/cxx/generate_algorithms.pl +87 -0
- data/vendor/snowball/cxx/stemmer.h +12 -0
- data/vendor/snowball/cxx/stemwords.cxx +176 -0
- data/vendor/snowball/cxx/utilities.cxx +2 -0
- data/vendor/snowball/dart/.gitignore +4 -0
- data/vendor/snowball/dart/analysis_options.yaml +1 -0
- data/vendor/snowball/dart/example/test_app.dart +65 -0
- data/vendor/snowball/dart/generate_algorithms.pl +21 -0
- data/vendor/snowball/dart/lib/snowball.dart +18 -0
- data/vendor/snowball/dart/lib/src/snowball.dart +339 -0
- data/vendor/snowball/dart/pubspec.yaml +17 -0
- data/vendor/snowball/doc/libstemmer_dart_README +37 -0
- data/vendor/snowball/doc/libstemmer_js_README +2 -2
- data/vendor/snowball/doc/libstemmer_php_README +38 -0
- data/vendor/snowball/doc/libstemmer_python_README +3 -3
- data/vendor/snowball/examples/stemwords.c +18 -3
- data/vendor/snowball/go/README.md +12 -4
- data/vendor/snowball/go/env.go +12 -14
- data/vendor/snowball/go/stemwords/main.go +2 -1
- data/vendor/snowball/java/org/tartarus/snowball/CharArraySequence.java +36 -0
- data/vendor/snowball/java/org/tartarus/snowball/SnowballProgram.java +17 -34
- data/vendor/snowball/java/org/tartarus/snowball/SnowballStemmer.java +0 -2
- data/vendor/snowball/javascript/base-stemmer.js +219 -252
- data/vendor/snowball/javascript/stemwords.js +86 -58
- data/vendor/snowball/libstemmer/mkmodules.pl +1 -1
- data/vendor/snowball/libstemmer/modules.txt +4 -0
- data/vendor/snowball/pascal/SnowballProgram.pas +18 -31
- data/vendor/snowball/php/base-stemmer.php +453 -0
- data/vendor/snowball/php/stemwords.php +25 -0
- data/vendor/snowball/python/create_init.py +16 -21
- data/vendor/snowball/python/pyproject.toml +3 -0
- data/vendor/snowball/python/setup.py +5 -7
- data/vendor/snowball/python/snowballstemmer/among.py +1 -2
- data/vendor/snowball/python/snowballstemmer/basestemmer.py +24 -33
- data/vendor/snowball/python/stemwords.py +72 -63
- data/vendor/snowball/runtime/api.c +11 -42
- data/vendor/snowball/runtime/api.h +11 -9
- data/vendor/snowball/runtime/snowball_runtime.h +110 -0
- data/vendor/snowball/runtime/utilities.c +282 -106
- data/vendor/snowball/rust/src/main.rs +2 -2
- data/vendor/snowball/rust/src/snowball/snowball_env.rs +7 -9
- data/vendor/snowball/tests/compilertest +62 -0
- data/vendor/snowball/tests/errors/ae-errors.sbl +53 -0
- data/vendor/snowball/tests/errors/ae-errors.stderr +8 -0
- data/vendor/snowball/tests/errors/bad-dollar.sbl +14 -0
- data/vendor/snowball/tests/errors/bad-dollar.stderr +4 -0
- data/vendor/snowball/tests/errors/bad-grouping-definition.sbl +9 -0
- data/vendor/snowball/tests/errors/bad-grouping-definition.stderr +6 -0
- data/vendor/snowball/tests/errors/missing-bra.sbl +6 -0
- data/vendor/snowball/tests/errors/missing-bra.stderr +3 -0
- data/vendor/snowball/tests/errors/missing-command.sbl +9 -0
- data/vendor/snowball/tests/errors/missing-command.stderr +1 -0
- data/vendor/snowball/tests/errors/missing-ket-backwardmode.sbl +3 -0
- data/vendor/snowball/tests/errors/missing-ket-backwardmode.stderr +1 -0
- data/vendor/snowball/tests/errors/missing-ket.sbl +7 -0
- data/vendor/snowball/tests/errors/missing-ket.stderr +6 -0
- data/vendor/snowball/tests/errors/notdefined.sbl +4 -0
- data/vendor/snowball/tests/errors/notdefined.stderr +2 -0
- data/vendor/snowball/tests/errors/string-omitted.sbl +5 -0
- data/vendor/snowball/tests/errors/string-omitted.stderr +1 -0
- data/vendor/snowball/tests/errors/undeclared.sbl +20 -0
- data/vendor/snowball/tests/errors/undeclared.stderr +9 -0
- data/vendor/snowball/tests/errors/unexpected-token.sbl +24 -0
- data/vendor/snowball/tests/errors/unexpected-token.stderr +17 -0
- data/vendor/snowball/tests/errors/wrongdirection.sbl +14 -0
- data/vendor/snowball/tests/errors/wrongdirection.stderr +1 -0
- data/vendor/snowball/tests/runtime/among.sbl +19 -0
- data/vendor/snowball/tests/runtime/arithmeticexpr.sbl +86 -0
- data/vendor/snowball/tests/runtime/attachinsert.sbl +47 -0
- data/vendor/snowball/tests/runtime/booleans.sbl +19 -0
- data/vendor/snowball/tests/runtime/externals.sbl +22 -0
- data/vendor/snowball/tests/runtime/hop.sbl +12 -0
- data/vendor/snowball/tests/runtime/integertests.sbl +60 -0
- data/vendor/snowball/tests/runtime/intlimits.sbl +25 -0
- data/vendor/snowball/tests/runtime/naming.sbl +20 -0
- data/vendor/snowball/tests/runtime/not.sbl +30 -0
- data/vendor/snowball/tests/runtime/or.sbl +17 -0
- data/vendor/snowball/tests/runtime/repeat.sbl +16 -0
- data/vendor/snowball/tests/runtime/setlimit.sbl +24 -0
- data/vendor/snowball/tests/runtime/sizelen.sbl +56 -0
- data/vendor/snowball/tests/runtime/slice.sbl +27 -0
- data/vendor/snowball/tests/runtime/stringdollar.sbl +39 -0
- data/vendor/snowball/tests/runtime/strings.sbl +66 -0
- data/vendor/snowball/tests/runtime/test.sbl +19 -0
- data/vendor/snowball/tests/stemtest.c +41 -1
- data/vendor/snowball/tests/syntax/canon.sbl +32 -0
- data/vendor/snowball/tests/syntax/canon.stderr +0 -0
- data/vendor/snowball/tests/syntax/canon.syntax +57 -0
- data/vendor/snowball/tests/syntax/emptyprogram.sbl +2 -0
- data/vendor/snowball/tests/syntax/emptyprogram.syntax +0 -0
- data/vendor/snowball/tests/syntax/groupings.sbl +11 -0
- data/vendor/snowball/tests/syntax/inline.sbl +144 -0
- data/vendor/snowball/tests/syntax/inline.stderr +0 -0
- data/vendor/snowball/tests/syntax/inline.syntax +121 -0
- data/vendor/snowball/tests/syntax/legacy.sbl +17 -0
- data/vendor/snowball/tests/syntax/legacy.stderr +5 -0
- data/vendor/snowball/tests/syntax/legacy.syntax +19 -0
- data/vendor/snowball/tests/syntax/loops.sbl +14 -0
- data/vendor/snowball/tests/syntax/loops.stderr +9 -0
- data/vendor/snowball/tests/syntax/loops.syntax +29 -0
- data/vendor/snowball/tests/syntax/noops.sbl +76 -0
- data/vendor/snowball/tests/syntax/noops.stderr +27 -0
- data/vendor/snowball/tests/syntax/noops.syntax +135 -0
- data/vendor/snowball/tests/syntax/simplifyae.sbl +21 -0
- data/vendor/snowball/tests/syntax/simplifyae.stderr +0 -0
- data/vendor/snowball/tests/syntax/simplifyae.syntax +39 -0
- data/vendor/snowball/tests/syntax/unused.sbl +18 -0
- data/vendor/snowball/tests/syntax/unused.stderr +7 -0
- data/vendor/snowball/tests/syntax/unused.syntax +3 -0
- data/vendor/snowball/zig/env.zig +599 -0
- data/vendor/snowball/zig/generate_algorithms.pl +19 -0
- data/vendor/snowball/zig/stemwords.zig +123 -0
- metadata +102 -4
- data/vendor/snowball/compiler/syswords.h +0 -86
- data/vendor/snowball/runtime/header.h +0 -62
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
#include <stdio.h>
|
|
2
|
+
#if __STDC_VERSION__ < 202311l
|
|
3
|
+
# include <stdbool.h>
|
|
4
|
+
#endif
|
|
2
5
|
|
|
3
|
-
#define SNOWBALL_VERSION "3.
|
|
6
|
+
#define SNOWBALL_VERSION "3.1.1"
|
|
4
7
|
|
|
5
8
|
typedef unsigned char byte;
|
|
6
9
|
typedef unsigned short symbol;
|
|
7
10
|
|
|
8
|
-
#define true 1
|
|
9
|
-
#define false 0
|
|
10
|
-
|
|
11
11
|
#define MALLOC check_malloc
|
|
12
12
|
#define FREE check_free
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
// Declare variable `V` of type `struct TYPE *` and dynamically allocate it.
|
|
15
|
+
// We exit on allocation failure so `V` is always non-NULL.
|
|
16
|
+
#define NEW(TYPE, V) struct TYPE * V = (struct TYPE *) MALLOC(sizeof(struct TYPE))
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
#define
|
|
18
|
+
// Similar to NEW() but allocates an array of N objects of type `struct TYPE *`.
|
|
19
|
+
#define NEWVEC(TYPE, V, N) struct TYPE * V = (struct TYPE *) MALLOC(sizeof(struct TYPE) * (N))
|
|
20
|
+
|
|
21
|
+
#define SIZE(p) ((const int *)(p))[-1]
|
|
22
|
+
#define SET_SIZE(p, n) ((int *)(p))[-1] = (n)
|
|
23
|
+
#define ADD_TO_SIZE(p, n) ((int *)(p))[-1] += (n)
|
|
24
|
+
#define CAPACITY(p) ((int *)(p))[-2]
|
|
19
25
|
|
|
20
26
|
extern symbol * create_b(int n);
|
|
21
27
|
extern void report_b(FILE * out, const symbol * p);
|
|
@@ -29,15 +35,20 @@ extern symbol * add_symbol_to_b(symbol * p, symbol ch);
|
|
|
29
35
|
// These routines are like those above but work in byte instead of symbol.
|
|
30
36
|
|
|
31
37
|
extern byte * create_s(int n);
|
|
38
|
+
extern byte * create_s_from_sz(const char * s);
|
|
39
|
+
extern byte * create_s_from_data(const char * s, int n);
|
|
40
|
+
|
|
32
41
|
extern void report_s(FILE * out, const byte * p);
|
|
33
42
|
extern void lose_s(byte * p);
|
|
34
43
|
extern byte * increase_capacity_s(byte * p, int n);
|
|
44
|
+
extern byte * ensure_capacity_s(byte * p, int n);
|
|
35
45
|
extern byte * copy_s(const byte * p);
|
|
36
|
-
extern byte * add_s_to_s(byte * p, const
|
|
46
|
+
extern byte * add_s_to_s(byte * p, const byte * s);
|
|
47
|
+
extern byte * add_slen_to_s(byte * p, const char * s, int n);
|
|
37
48
|
extern byte * add_sz_to_s(byte * p, const char * s);
|
|
38
49
|
extern byte * add_char_to_s(byte * p, char ch);
|
|
39
50
|
// "" LIT is a trick to make compilation fail if LIT is not a string literal.
|
|
40
|
-
#define add_literal_to_s(P, LIT)
|
|
51
|
+
#define add_literal_to_s(P, LIT) add_slen_to_s(P, "" LIT, sizeof(LIT) - 1)
|
|
41
52
|
|
|
42
53
|
struct str; /* defined in space.c */
|
|
43
54
|
|
|
@@ -56,12 +67,13 @@ extern byte * str_data(const struct str * str);
|
|
|
56
67
|
extern int str_len(const struct str * str);
|
|
57
68
|
extern int str_back(const struct str *str);
|
|
58
69
|
extern void str_pop(const struct str *str);
|
|
70
|
+
extern void str_pop_n(const struct str *str, int n);
|
|
59
71
|
extern void output_str(FILE * outfile, struct str * str);
|
|
60
72
|
|
|
61
73
|
extern int get_utf8(const symbol * p, int * slot);
|
|
62
74
|
extern int put_utf8(int ch, symbol * p);
|
|
63
75
|
|
|
64
|
-
typedef enum { ENC_SINGLEBYTE, ENC_UTF8, ENC_WIDECHARS } enc;
|
|
76
|
+
typedef enum { ENC_SINGLEBYTE = 0, ENC_UTF8, ENC_WIDECHARS } enc;
|
|
65
77
|
|
|
66
78
|
/* stringdef name and value */
|
|
67
79
|
struct m_pair {
|
|
@@ -120,7 +132,7 @@ enum token_codes {
|
|
|
120
132
|
c_literalstring,
|
|
121
133
|
|
|
122
134
|
/* These token values are synthesised by the analyser. */
|
|
123
|
-
|
|
135
|
+
c_stringassign,
|
|
124
136
|
c_neg,
|
|
125
137
|
c_call,
|
|
126
138
|
c_grouping,
|
|
@@ -130,12 +142,13 @@ enum token_codes {
|
|
|
130
142
|
c_gopast_grouping,
|
|
131
143
|
c_goto_non,
|
|
132
144
|
c_gopast_non,
|
|
145
|
+
c_not_booltest,
|
|
133
146
|
|
|
134
147
|
NUM_TOKEN_CODES
|
|
135
148
|
};
|
|
136
149
|
|
|
137
150
|
enum uplus_modes {
|
|
138
|
-
UPLUS_NONE,
|
|
151
|
+
UPLUS_NONE = 0,
|
|
139
152
|
UPLUS_DEFINED,
|
|
140
153
|
UPLUS_UNICODE
|
|
141
154
|
};
|
|
@@ -157,18 +170,21 @@ struct tokeniser {
|
|
|
157
170
|
// Used for c_name names.
|
|
158
171
|
byte * s;
|
|
159
172
|
int number;
|
|
173
|
+
// String escape start character or -1.
|
|
160
174
|
int m_start;
|
|
175
|
+
// String escape end character.
|
|
161
176
|
int m_end;
|
|
177
|
+
// Link list of stringdefs.
|
|
162
178
|
struct m_pair * m_pairs;
|
|
179
|
+
// Nesting depth of get directives.
|
|
163
180
|
int get_depth;
|
|
164
181
|
int error_count;
|
|
165
182
|
int token;
|
|
166
183
|
int previous_token;
|
|
167
|
-
|
|
168
|
-
|
|
184
|
+
bool token_held;
|
|
185
|
+
bool token_reported_as_unexpected;
|
|
169
186
|
enc encoding;
|
|
170
187
|
|
|
171
|
-
int omission;
|
|
172
188
|
struct include * includes;
|
|
173
189
|
|
|
174
190
|
/* Mode in which U+ has been used:
|
|
@@ -194,6 +210,13 @@ extern int space_count;
|
|
|
194
210
|
extern void * check_malloc(size_t n);
|
|
195
211
|
extern void check_free(void * p);
|
|
196
212
|
|
|
213
|
+
extern int checked_snprintf(char *str, size_t size,
|
|
214
|
+
const char *restrict format, ...)
|
|
215
|
+
#ifdef __GNUC__
|
|
216
|
+
__attribute__ ((__format__ (__printf__, 3, 4)))
|
|
217
|
+
#endif
|
|
218
|
+
;
|
|
219
|
+
|
|
197
220
|
struct node;
|
|
198
221
|
|
|
199
222
|
struct name {
|
|
@@ -201,16 +224,24 @@ struct name {
|
|
|
201
224
|
byte * s;
|
|
202
225
|
byte type; /* t_string etc */
|
|
203
226
|
byte mode; /* for routines, externals (m_forward, etc) */
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
227
|
+
bool value_used; /* (For variables) is its value ever used? */
|
|
228
|
+
bool initialised; /* (For variables) is it ever initialised? */
|
|
229
|
+
bool used_in_definition; /* (grouping) used in grouping definition? */
|
|
230
|
+
bool amongvar_needed; /* for routines, externals */
|
|
231
|
+
bool among_with_function; /* (routines/externals) contains among with func */
|
|
232
|
+
bool case_collision; /* A name of the same type differs only by case */
|
|
233
|
+
struct node * definition; /* (routines/externals) c_define node */
|
|
234
|
+
int uses_in_among; /* (routines/externals) Count of uses in amongs */
|
|
235
|
+
// Initialised to -1; set to -2 if reachable from an external.
|
|
236
|
+
// Reachable names are then numbered 0, 1, 2, ... with separate numbering
|
|
237
|
+
// per type.
|
|
238
|
+
int count;
|
|
239
|
+
// Number of references to this name.
|
|
240
|
+
int references;
|
|
211
241
|
struct grouping * grouping; /* for grouping names */
|
|
212
242
|
struct node * used; /* First use, or NULL if not used */
|
|
213
243
|
struct name * local_to; /* Local to one routine/external */
|
|
244
|
+
int among_index; /* for functions used in among */
|
|
214
245
|
int declaration_line_number;/* Line number of declaration */
|
|
215
246
|
};
|
|
216
247
|
|
|
@@ -225,7 +256,11 @@ struct amongvec {
|
|
|
225
256
|
struct node * action; /* the corresponding action */
|
|
226
257
|
int i; /* the amongvec index of the longest substring of b */
|
|
227
258
|
int result; /* the numeric result for the case */
|
|
228
|
-
int line_number; /* for diagnostics
|
|
259
|
+
int line_number; /* for diagnostics */
|
|
260
|
+
int function_index; /* 1-based */
|
|
261
|
+
// 0-based index giving order of strings in source. Used for stable
|
|
262
|
+
// sorting of amongvec entries and -coverage.
|
|
263
|
+
int string_index;
|
|
229
264
|
struct name * function;
|
|
230
265
|
};
|
|
231
266
|
|
|
@@ -234,15 +269,19 @@ struct among {
|
|
|
234
269
|
struct amongvec * b; /* pointer to the amongvec */
|
|
235
270
|
int number; /* amongs are numbered 0, 1, 2 ... */
|
|
236
271
|
int literalstring_count; /* in this among */
|
|
237
|
-
int command_count; /* in this among (
|
|
272
|
+
int command_count; /* in this among (excludes "no command" entries) */
|
|
238
273
|
int nocommand_count; /* number of "no command" entries in this among */
|
|
239
|
-
int function_count; /* in this among */
|
|
240
|
-
|
|
241
|
-
|
|
274
|
+
int function_count; /* number of different functions in this among */
|
|
275
|
+
bool amongvar_needed; /* do we need to set among_var? */
|
|
276
|
+
bool always_matches; /* will this among always match? */
|
|
277
|
+
bool used; /* is this among in reachable code? */
|
|
278
|
+
int same_action; /* type code if same for all actions; <0 otherwise */
|
|
242
279
|
int shortest_size; /* smallest non-zero string length in this among */
|
|
280
|
+
int longest_size; /* longest string length in this among */
|
|
243
281
|
struct node * substring; /* i.e. substring ... among ( ... ) */
|
|
244
282
|
struct node ** commands; /* array with command_count entries */
|
|
245
283
|
struct node * node; /* pointer to the node for this among */
|
|
284
|
+
struct name * in_routine; /* pointer to name for routine this among is in */
|
|
246
285
|
};
|
|
247
286
|
|
|
248
287
|
struct grouping {
|
|
@@ -266,14 +305,17 @@ struct node {
|
|
|
266
305
|
// (e.g. 42, 2+2, lenof '{U+0246}') from constant AEs which can have a
|
|
267
306
|
// different value depending on platform and/or target language and/or
|
|
268
307
|
// Unicode mode (e.g. maxint, sizeof '{U+0246}') - some warnings which
|
|
269
|
-
// depend on a constant
|
|
270
|
-
|
|
308
|
+
// depend on a constant AE's value should only fire for the first set.
|
|
309
|
+
bool fixed_constant;
|
|
310
|
+
// Return 0 for always f.
|
|
311
|
+
// Return 1 for always t.
|
|
312
|
+
// Return -1 for don't know (or can raise t or f).
|
|
313
|
+
signed char possible_signals;
|
|
271
314
|
struct node * AE;
|
|
272
315
|
struct name * name;
|
|
273
316
|
symbol * literalstring;
|
|
274
317
|
int number;
|
|
275
318
|
int line_number;
|
|
276
|
-
int amongvar_needed; /* used in routine definitions */
|
|
277
319
|
};
|
|
278
320
|
|
|
279
321
|
enum name_types {
|
|
@@ -285,37 +327,32 @@ enum name_types {
|
|
|
285
327
|
/* If this list is extended, adjust write_varname in generator.c */
|
|
286
328
|
};
|
|
287
329
|
|
|
288
|
-
/* In name_count[i] below, remember that
|
|
289
|
-
type is
|
|
290
|
-
----+----
|
|
291
|
-
0 | string
|
|
292
|
-
1 | boolean
|
|
293
|
-
2 | integer
|
|
294
|
-
3 | routine
|
|
295
|
-
4 | external
|
|
296
|
-
5 | grouping
|
|
297
|
-
*/
|
|
298
|
-
|
|
299
330
|
struct analyser {
|
|
300
331
|
struct tokeniser * tokeniser;
|
|
301
332
|
struct node * nodes;
|
|
302
333
|
struct name * names;
|
|
303
334
|
struct literalstring * literalstrings;
|
|
304
335
|
byte mode;
|
|
305
|
-
|
|
336
|
+
bool modifyable; /* false inside reverse(...) */
|
|
306
337
|
struct node * program;
|
|
307
338
|
struct node * program_end;
|
|
308
|
-
|
|
339
|
+
/* name_count[i] counts the number of names of type i, where i is an enum
|
|
340
|
+
* name_types value. These counts *EXCLUDE* localised variables and
|
|
341
|
+
* variables which optimised away (e.g. declared but never used).
|
|
342
|
+
*/
|
|
343
|
+
int name_count[t_size];
|
|
344
|
+
/* name_count[t_string] + name_count[t_boolean] + name_count[t_integer] */
|
|
345
|
+
int variable_count;
|
|
309
346
|
struct among * amongs;
|
|
310
347
|
struct among * amongs_end;
|
|
311
|
-
int among_count;
|
|
312
|
-
int amongvar_needed; /* used in reading routine definitions */
|
|
313
348
|
int among_with_function_count; /* number of amongs with functions */
|
|
314
349
|
struct grouping * groupings;
|
|
315
350
|
struct grouping * groupings_end;
|
|
316
351
|
struct node * substring; /* pending 'substring' in current routine definition */
|
|
352
|
+
struct name * current_routine; /* routine/external we're currently on. */
|
|
317
353
|
enc encoding;
|
|
318
|
-
|
|
354
|
+
bool int_limits_used; /* are maxint or minint used? */
|
|
355
|
+
bool debug_used; /* is the '?' command used? */
|
|
319
356
|
};
|
|
320
357
|
|
|
321
358
|
enum analyser_modes {
|
|
@@ -330,20 +367,22 @@ extern void print_program(struct analyser * a);
|
|
|
330
367
|
extern struct analyser * create_analyser(struct tokeniser * t);
|
|
331
368
|
extern void close_analyser(struct analyser * a);
|
|
332
369
|
|
|
333
|
-
|
|
370
|
+
/** Read and analyse the program.
|
|
371
|
+
*
|
|
372
|
+
* @param localise_mask bitmask of variable types the generator can localise
|
|
373
|
+
*/
|
|
374
|
+
extern void read_program(struct analyser * a, unsigned localise_mask);
|
|
334
375
|
|
|
335
376
|
struct generator {
|
|
336
377
|
struct analyser * analyser;
|
|
337
378
|
struct options * options;
|
|
338
|
-
|
|
339
|
-
* is unreachable. */
|
|
379
|
+
bool unreachable; /* false if code can be reached, true if current
|
|
380
|
+
* code is unreachable. */
|
|
340
381
|
int var_number; /* Number of next variable to use. */
|
|
341
382
|
struct str * outbuf; /* temporary str to store output */
|
|
342
383
|
struct str * declarations; /* str storing variable declarations */
|
|
343
384
|
int next_label;
|
|
344
|
-
|
|
345
|
-
int max_label;
|
|
346
|
-
#endif
|
|
385
|
+
int max_label; /* Only used by Python */
|
|
347
386
|
int margin;
|
|
348
387
|
|
|
349
388
|
/* Target language code to execute in case of failure. */
|
|
@@ -357,15 +396,19 @@ struct generator {
|
|
|
357
396
|
const char * S[10]; /* strings */
|
|
358
397
|
byte * B[10]; /* byte blocks */
|
|
359
398
|
int I[10]; /* integers */
|
|
360
|
-
struct name * V[5]; /* variables */
|
|
361
|
-
symbol * L[5]; /* literals, used in formatted write */
|
|
362
399
|
|
|
363
400
|
int line_count; /* counts number of lines output */
|
|
364
401
|
int line_labelled; /* in ISO C, will need extra ';' if it is a block end */
|
|
365
402
|
int literalstring_count;
|
|
366
403
|
int keep_count; /* used to number keep/restore pairs to avoid compiler warnings
|
|
367
404
|
about shadowed variables */
|
|
368
|
-
|
|
405
|
+
bool temporary_used; /* track if temporary variable used (Ada and Pascal) */
|
|
406
|
+
char java_import_arrays; /* need `import java.util.Arrays;` */
|
|
407
|
+
char java_import_chararraysequence; /* need `import org.tartarus.snowball.CharArraySequence;` */
|
|
408
|
+
// Prefix for generated variable names (`v_` by default).
|
|
409
|
+
const char * varname_prefix;
|
|
410
|
+
// String to indent by for each margin level (four spaces by default).
|
|
411
|
+
const char * margin_indent;
|
|
369
412
|
};
|
|
370
413
|
|
|
371
414
|
/* Special values for failure_label in struct generator. */
|
|
@@ -375,17 +418,37 @@ enum special_labels {
|
|
|
375
418
|
|
|
376
419
|
struct options {
|
|
377
420
|
/* for the command line: */
|
|
378
|
-
|
|
379
|
-
|
|
421
|
+
byte * output_file;
|
|
422
|
+
// output_file but without any path.
|
|
423
|
+
byte * output_leaf;
|
|
424
|
+
// Extension specified in -o option (or NULL if none).
|
|
425
|
+
byte * extension;
|
|
426
|
+
byte * name;
|
|
380
427
|
FILE * output_src;
|
|
381
428
|
FILE * output_h;
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
429
|
+
bool syntax_tree;
|
|
430
|
+
bool comments;
|
|
431
|
+
bool coverage;
|
|
385
432
|
enc encoding;
|
|
386
|
-
enum {
|
|
433
|
+
enum {
|
|
434
|
+
LANG_C = 0, // We generate C by default.
|
|
435
|
+
LANG_ADA,
|
|
436
|
+
LANG_CPLUSPLUS,
|
|
437
|
+
LANG_CSHARP,
|
|
438
|
+
LANG_DART,
|
|
439
|
+
LANG_GO,
|
|
440
|
+
LANG_JAVA,
|
|
441
|
+
LANG_JAVASCRIPT,
|
|
442
|
+
LANG_PASCAL,
|
|
443
|
+
LANG_PHP,
|
|
444
|
+
LANG_PYTHON,
|
|
445
|
+
LANG_RUST,
|
|
446
|
+
LANG_ZIG
|
|
447
|
+
} target_lang;
|
|
387
448
|
const char * externals_prefix;
|
|
388
449
|
const char * variables_prefix;
|
|
450
|
+
const char * cheader;
|
|
451
|
+
const char * hheader;
|
|
389
452
|
const char * runtime_path;
|
|
390
453
|
const char * parent_class_name;
|
|
391
454
|
const char * package;
|
|
@@ -401,64 +464,68 @@ struct options {
|
|
|
401
464
|
extern struct generator * create_generator(struct analyser * a, struct options * o);
|
|
402
465
|
extern void close_generator(struct generator * g);
|
|
403
466
|
|
|
467
|
+
static inline int new_label(struct generator * g) {
|
|
468
|
+
return g->next_label++;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
extern struct str * vars_newname(struct generator * g);
|
|
472
|
+
|
|
473
|
+
extern void write_margin(struct generator * g);
|
|
474
|
+
|
|
404
475
|
extern void write_char(struct generator * g, int ch);
|
|
405
476
|
extern void write_newline(struct generator * g);
|
|
406
477
|
extern void write_string(struct generator * g, const char * s);
|
|
407
478
|
extern void write_wchar_as_utf8(struct generator * g, symbol ch);
|
|
408
479
|
extern void write_int(struct generator * g, int i);
|
|
409
|
-
extern void
|
|
480
|
+
extern void wi3(struct generator * g, int i);
|
|
481
|
+
extern void write_hex4(struct generator * g, unsigned ch);
|
|
482
|
+
extern void write_hex(struct generator * g, unsigned i);
|
|
410
483
|
extern void write_symbol(struct generator * g, symbol s);
|
|
411
484
|
extern void write_s(struct generator * g, const byte * b);
|
|
412
485
|
extern void write_str(struct generator * g, struct str * str);
|
|
413
486
|
extern void write_c_relop(struct generator * g, int relop);
|
|
414
487
|
|
|
415
|
-
extern void write_comment_content(struct generator * g, struct node * p
|
|
488
|
+
extern void write_comment_content(struct generator * g, struct node * p,
|
|
489
|
+
const char * end);
|
|
416
490
|
extern void write_generated_comment_content(struct generator * g);
|
|
417
491
|
extern void write_start_comment(struct generator * g,
|
|
418
492
|
const char * comment_start,
|
|
419
493
|
const char * comment_end);
|
|
420
494
|
|
|
421
|
-
extern int K_needed(struct
|
|
422
|
-
extern int
|
|
423
|
-
extern int
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
495
|
+
extern int K_needed(struct node * p);
|
|
496
|
+
extern int K_needed_node_on_f(struct node * p);
|
|
497
|
+
extern int K_needed_for_and(struct node * p);
|
|
498
|
+
extern int K_needed_for_or(struct node * p);
|
|
499
|
+
extern int repeat_restore(struct node * p);
|
|
500
|
+
|
|
501
|
+
extern int just_return_on_fail(struct generator * g);
|
|
502
|
+
extern int tailcallable(struct generator * g, struct node * p);
|
|
427
503
|
|
|
428
504
|
/* Generator for C code. */
|
|
429
505
|
extern void generate_program_c(struct generator * g);
|
|
430
506
|
|
|
431
|
-
#ifndef DISABLE_JAVA
|
|
432
507
|
/* Generator for Java code. */
|
|
433
508
|
extern void generate_program_java(struct generator * g);
|
|
434
|
-
#endif
|
|
435
509
|
|
|
436
|
-
|
|
510
|
+
/* Generator for Dart code. */
|
|
511
|
+
extern void generate_program_dart(struct generator * g);
|
|
512
|
+
|
|
437
513
|
/* Generator for C# code. */
|
|
438
514
|
extern void generate_program_csharp(struct generator * g);
|
|
439
|
-
#endif
|
|
440
515
|
|
|
441
|
-
#ifndef DISABLE_PASCAL
|
|
442
516
|
extern void generate_program_pascal(struct generator * g);
|
|
443
|
-
#endif
|
|
444
517
|
|
|
445
|
-
|
|
518
|
+
extern void generate_program_php(struct generator * g);
|
|
519
|
+
|
|
446
520
|
/* Generator for Python code. */
|
|
447
521
|
extern void generate_program_python(struct generator * g);
|
|
448
|
-
#endif
|
|
449
522
|
|
|
450
|
-
#ifndef DISABLE_JS
|
|
451
523
|
extern void generate_program_js(struct generator * g);
|
|
452
|
-
#endif
|
|
453
524
|
|
|
454
|
-
#ifndef DISABLE_RUST
|
|
455
525
|
extern void generate_program_rust(struct generator * g);
|
|
456
|
-
#endif
|
|
457
526
|
|
|
458
|
-
#ifndef DISABLE_GO
|
|
459
527
|
extern void generate_program_go(struct generator * g);
|
|
460
|
-
#endif
|
|
461
528
|
|
|
462
|
-
#ifndef DISABLE_ADA
|
|
463
529
|
extern void generate_program_ada(struct generator * g);
|
|
464
|
-
|
|
530
|
+
|
|
531
|
+
extern void generate_program_zig(struct generator * g);
|