mittens 0.3.3 → 0.3.5
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/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/ext/mittens/ext.c +68 -30
- data/ext/mittens/extconf.rb +2 -0
- data/lib/mittens/version.rb +1 -1
- data/vendor/snowball/.github/workflows/ci.yml +43 -3
- data/vendor/snowball/.github/workflows/coverage.yml +8 -5
- data/vendor/snowball/GNUmakefile +46 -16
- data/vendor/snowball/NEWS +437 -13
- data/vendor/snowball/README.rst +4 -4
- data/vendor/snowball/algorithms/earlymodernenglish.sbl +301 -0
- data/vendor/snowball/algorithms/french.sbl +1 -1
- data/vendor/snowball/algorithms/ukrainian.sbl +1251 -0
- data/vendor/snowball/compiler/analyser.c +460 -156
- data/vendor/snowball/compiler/driver.c +41 -36
- data/vendor/snowball/compiler/generator.c +24 -1
- data/vendor/snowball/compiler/generator_ada.c +46 -45
- data/vendor/snowball/compiler/generator_c.c +1094 -187
- data/vendor/snowball/compiler/generator_csharp.c +34 -11
- data/vendor/snowball/compiler/generator_dart.c +39 -11
- data/vendor/snowball/compiler/generator_go.c +6 -6
- data/vendor/snowball/compiler/generator_java.c +29 -8
- data/vendor/snowball/compiler/generator_js.c +65 -38
- data/vendor/snowball/compiler/generator_pascal.c +69 -26
- data/vendor/snowball/compiler/generator_php.c +33 -12
- data/vendor/snowball/compiler/generator_python.c +23 -4
- data/vendor/snowball/compiler/generator_rust.c +37 -13
- data/vendor/snowball/compiler/generator_zig.c +6 -6
- data/vendor/snowball/compiler/header.h +85 -14
- data/vendor/snowball/compiler/space.c +67 -38
- data/vendor/snowball/compiler/tokeniser.c +28 -16
- data/vendor/snowball/csharp/Snowball/AssemblyInfo.cs +2 -2
- data/vendor/snowball/csharp/Snowball/Stemmer.cs +1 -4
- data/vendor/snowball/cxx/generate_algorithms.pl +5 -4
- data/vendor/snowball/cxx/{utilities.cxx → snowball_runtime.cxx} +1 -1
- data/vendor/snowball/cxx/stemmer.h +4 -0
- data/vendor/snowball/cxx/stemwords.cxx +36 -6
- data/vendor/snowball/dart/lib/src/snowball.dart +2 -2
- data/vendor/snowball/dart/pubspec.yaml +1 -1
- data/vendor/snowball/doc/libstemmer_c_README +3 -0
- data/vendor/snowball/doc/libstemmer_php_README +1 -1
- data/vendor/snowball/doc/libstemmer_python_README +8 -6
- data/vendor/snowball/examples/stemwords.c +4 -14
- data/vendor/snowball/go/env.go +16 -4
- data/vendor/snowball/include/libstemmer.h +0 -3
- data/vendor/snowball/java/org/tartarus/snowball/SnowballProgram.java +4 -4
- data/vendor/snowball/javascript/base-stemmer.js +27 -40
- data/vendor/snowball/javascript/stemwords.js +34 -10
- data/vendor/snowball/libstemmer/libstemmer_c.in +5 -5
- data/vendor/snowball/libstemmer/mkmodules.pl +5 -3
- data/vendor/snowball/libstemmer/modules.txt +4 -2
- data/vendor/snowball/pascal/SnowballProgram.pas +2 -2
- data/vendor/snowball/php/base-stemmer.php +2 -2
- data/vendor/snowball/python/setup.py +5 -1
- data/vendor/snowball/python/snowballstemmer/basestemmer.py +1 -2
- data/vendor/snowball/runtime/api.c +14 -3
- data/vendor/snowball/runtime/api.h +13 -9
- data/vendor/snowball/runtime/{utilities.c → snowball_runtime.c} +115 -181
- data/vendor/snowball/runtime/snowball_runtime.h +35 -24
- data/vendor/snowball/rust/src/snowball/snowball_env.rs +1 -1
- data/vendor/snowball/tests/compilertest +3 -3
- data/vendor/snowball/tests/runtime/among.sbl +96 -2
- data/vendor/snowball/tests/runtime/attachinsert.sbl +4 -0
- data/vendor/snowball/tests/runtime/debug.out +7 -0
- data/vendor/snowball/tests/runtime/debug.sbl +9 -0
- data/vendor/snowball/tests/runtime/integertests.sbl +22 -0
- data/vendor/snowball/tests/runtime/marklimit.sbl +30 -0
- data/vendor/snowball/tests/runtime/naming.sbl +20 -0
- data/vendor/snowball/tests/runtime/reverse.sbl +11 -0
- data/vendor/snowball/tests/stemtest.c +2 -5
- data/vendor/snowball/tests/syntax/aeslicefrom.sbl +7 -0
- data/vendor/snowball/tests/syntax/canon.sbl +14 -0
- data/vendor/snowball/tests/syntax/canon.syntax +36 -0
- data/vendor/snowball/tests/syntax/inline.syntax +4 -4
- data/vendor/snowball/tests/syntax/localvar.sbl +38 -0
- data/vendor/snowball/tests/syntax/localvar.stderr +3 -0
- data/vendor/snowball/tests/syntax/localvar.syntax +76 -0
- data/vendor/snowball/tests/syntax/unused.sbl +5 -1
- data/vendor/snowball/tests/syntax/unused.stderr +3 -1
- data/vendor/snowball/zig/env.zig +24 -4
- metadata +14 -4
|
@@ -80,9 +80,9 @@ static void check_lim(int i, int argc) {
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
static FILE * get_output(byte
|
|
84
|
-
|
|
85
|
-
const char * filename = (const char *)
|
|
83
|
+
static FILE * get_output(byte ** s_ptr) {
|
|
84
|
+
*s_ptr = ensure_nul_s(*s_ptr);
|
|
85
|
+
const char * filename = (const char *)*s_ptr;
|
|
86
86
|
FILE * output = fopen(filename, "w");
|
|
87
87
|
if (output == NULL) {
|
|
88
88
|
fprintf(stderr, "Can't open output %s\n", filename);
|
|
@@ -396,7 +396,7 @@ static struct options * read_options(int * argc_ptr, char * argv[]) {
|
|
|
396
396
|
|
|
397
397
|
const char * dot = strrchr(leaf, '.');
|
|
398
398
|
if (dot) {
|
|
399
|
-
o->output_file = create_s_from_data(leaf, dot - leaf);
|
|
399
|
+
o->output_file = create_s_from_data(leaf, (int)(dot - leaf));
|
|
400
400
|
} else {
|
|
401
401
|
o->output_file = create_s_from_sz(leaf);
|
|
402
402
|
}
|
|
@@ -404,21 +404,26 @@ static struct options * read_options(int * argc_ptr, char * argv[]) {
|
|
|
404
404
|
} else {
|
|
405
405
|
// Remove any extension from o->output_file so `-o path/to/english.c`
|
|
406
406
|
// works.
|
|
407
|
-
o->output_file[SIZE(o->output_file)] = '\0';
|
|
408
407
|
const char * output_file = (const char *)o->output_file;
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
408
|
+
int size = SIZE(output_file);
|
|
409
|
+
int leaf = size;
|
|
410
|
+
while (leaf > 0) {
|
|
411
|
+
int ch = output_file[leaf - 1];
|
|
412
|
+
if (ch == '/' || ch == '\\') break;
|
|
413
|
+
--leaf;
|
|
414
|
+
}
|
|
415
|
+
int ext = size;
|
|
416
|
+
while (ext > leaf) {
|
|
417
|
+
int ch = output_file[--ext];
|
|
418
|
+
if (ch == '.') {
|
|
419
|
+
o->extension = create_s_from_data(output_file + ext, (int)(size - ext));
|
|
420
|
+
SET_SIZE(o->output_file, ext);
|
|
421
|
+
o->output_leaf = create_s_from_data(output_file + leaf, (int)(ext - leaf));
|
|
422
|
+
break;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (ext == leaf) {
|
|
426
|
+
o->output_leaf = create_s_from_data(output_file + leaf, (int)(size - leaf));
|
|
422
427
|
}
|
|
423
428
|
}
|
|
424
429
|
|
|
@@ -428,7 +433,7 @@ static struct options * read_options(int * argc_ptr, char * argv[]) {
|
|
|
428
433
|
if (dot) {
|
|
429
434
|
// Trim off any extension (we only remove the last of multiple
|
|
430
435
|
// extensions above).
|
|
431
|
-
SET_SIZE(o->name, dot - o->name);
|
|
436
|
+
SET_SIZE(o->name, (int)(dot - o->name));
|
|
432
437
|
}
|
|
433
438
|
switch (o->target_lang) {
|
|
434
439
|
case LANG_CSHARP:
|
|
@@ -443,10 +448,10 @@ static struct options * read_options(int * argc_ptr, char * argv[]) {
|
|
|
443
448
|
* underscore+letter or hyphen+letter to an upper case
|
|
444
449
|
* letter.
|
|
445
450
|
*/
|
|
446
|
-
|
|
447
|
-
|
|
451
|
+
int len = SIZE(o->name);
|
|
452
|
+
int new_len = 0;
|
|
448
453
|
bool uc_next = true;
|
|
449
|
-
for (
|
|
454
|
+
for (int j = 0; j != len; ++j) {
|
|
450
455
|
byte ch = o->name[j];
|
|
451
456
|
if (ch == '_' || ch == '-') {
|
|
452
457
|
uc_next = true;
|
|
@@ -586,7 +591,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
586
591
|
case LANG_CPLUSPLUS: {
|
|
587
592
|
byte * s = copy_s(o->output_file);
|
|
588
593
|
s = add_literal_to_s(s, ".h");
|
|
589
|
-
o->output_h = get_output(s);
|
|
594
|
+
o->output_h = get_output(&s);
|
|
590
595
|
SET_SIZE(s, SIZE(o->output_file));
|
|
591
596
|
if (o->extension &&
|
|
592
597
|
!(SIZE(o->extension) == 2 && memcmp(o->extension, ".h", 2) == 0)) {
|
|
@@ -596,7 +601,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
596
601
|
} else {
|
|
597
602
|
s = add_literal_to_s(s, ".c");
|
|
598
603
|
}
|
|
599
|
-
o->output_src = get_output(s);
|
|
604
|
+
o->output_src = get_output(&s);
|
|
600
605
|
lose_s(s);
|
|
601
606
|
|
|
602
607
|
generate_program_c(g);
|
|
@@ -608,7 +613,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
608
613
|
case LANG_ADA: {
|
|
609
614
|
byte * s = copy_s(o->output_file);
|
|
610
615
|
s = add_literal_to_s(s, ".ads");
|
|
611
|
-
o->output_h = get_output(s);
|
|
616
|
+
o->output_h = get_output(&s);
|
|
612
617
|
SET_SIZE(s, SIZE(o->output_file));
|
|
613
618
|
if (o->extension &&
|
|
614
619
|
!(SIZE(o->extension) == 4 && memcmp(o->extension, ".ads", 2) == 0)) {
|
|
@@ -617,7 +622,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
617
622
|
} else {
|
|
618
623
|
s = add_literal_to_s(s, ".adb");
|
|
619
624
|
}
|
|
620
|
-
o->output_src = get_output(s);
|
|
625
|
+
o->output_src = get_output(&s);
|
|
621
626
|
lose_s(s);
|
|
622
627
|
|
|
623
628
|
generate_program_ada(g);
|
|
@@ -632,7 +637,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
632
637
|
} else {
|
|
633
638
|
s = add_literal_to_s(s, ".cs");
|
|
634
639
|
}
|
|
635
|
-
o->output_src = get_output(s);
|
|
640
|
+
o->output_src = get_output(&s);
|
|
636
641
|
lose_s(s);
|
|
637
642
|
generate_program_csharp(g);
|
|
638
643
|
fclose(o->output_src);
|
|
@@ -645,7 +650,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
645
650
|
} else {
|
|
646
651
|
s = add_literal_to_s(s, ".dart");
|
|
647
652
|
}
|
|
648
|
-
o->output_src = get_output(s);
|
|
653
|
+
o->output_src = get_output(&s);
|
|
649
654
|
lose_s(s);
|
|
650
655
|
generate_program_dart(g);
|
|
651
656
|
fclose(o->output_src);
|
|
@@ -658,7 +663,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
658
663
|
} else {
|
|
659
664
|
s = add_literal_to_s(s, ".go");
|
|
660
665
|
}
|
|
661
|
-
o->output_src = get_output(s);
|
|
666
|
+
o->output_src = get_output(&s);
|
|
662
667
|
lose_s(s);
|
|
663
668
|
generate_program_go(g);
|
|
664
669
|
fclose(o->output_src);
|
|
@@ -671,7 +676,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
671
676
|
} else {
|
|
672
677
|
s = add_literal_to_s(s, ".java");
|
|
673
678
|
}
|
|
674
|
-
o->output_src = get_output(s);
|
|
679
|
+
o->output_src = get_output(&s);
|
|
675
680
|
lose_s(s);
|
|
676
681
|
generate_program_java(g);
|
|
677
682
|
fclose(o->output_src);
|
|
@@ -684,7 +689,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
684
689
|
} else {
|
|
685
690
|
s = add_literal_to_s(s, ".js");
|
|
686
691
|
}
|
|
687
|
-
o->output_src = get_output(s);
|
|
692
|
+
o->output_src = get_output(&s);
|
|
688
693
|
lose_s(s);
|
|
689
694
|
generate_program_js(g);
|
|
690
695
|
fclose(o->output_src);
|
|
@@ -697,7 +702,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
697
702
|
} else {
|
|
698
703
|
s = add_literal_to_s(s, ".pas");
|
|
699
704
|
}
|
|
700
|
-
o->output_src = get_output(s);
|
|
705
|
+
o->output_src = get_output(&s);
|
|
701
706
|
lose_s(s);
|
|
702
707
|
generate_program_pascal(g);
|
|
703
708
|
fclose(o->output_src);
|
|
@@ -710,7 +715,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
710
715
|
} else {
|
|
711
716
|
s = add_literal_to_s(s, ".php");
|
|
712
717
|
}
|
|
713
|
-
o->output_src = get_output(s);
|
|
718
|
+
o->output_src = get_output(&s);
|
|
714
719
|
lose_s(s);
|
|
715
720
|
generate_program_php(g);
|
|
716
721
|
fclose(o->output_src);
|
|
@@ -723,7 +728,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
723
728
|
} else {
|
|
724
729
|
s = add_literal_to_s(s, ".py");
|
|
725
730
|
}
|
|
726
|
-
o->output_src = get_output(s);
|
|
731
|
+
o->output_src = get_output(&s);
|
|
727
732
|
lose_s(s);
|
|
728
733
|
generate_program_python(g);
|
|
729
734
|
fclose(o->output_src);
|
|
@@ -736,7 +741,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
736
741
|
} else {
|
|
737
742
|
s = add_literal_to_s(s, ".rs");
|
|
738
743
|
}
|
|
739
|
-
o->output_src = get_output(s);
|
|
744
|
+
o->output_src = get_output(&s);
|
|
740
745
|
lose_s(s);
|
|
741
746
|
generate_program_rust(g);
|
|
742
747
|
fclose(o->output_src);
|
|
@@ -749,7 +754,7 @@ extern int main(int argc, char * argv[]) {
|
|
|
749
754
|
} else {
|
|
750
755
|
s = add_literal_to_s(s, ".zig");
|
|
751
756
|
}
|
|
752
|
-
o->output_src = get_output(s);
|
|
757
|
+
o->output_src = get_output(&s);
|
|
753
758
|
lose_s(s);
|
|
754
759
|
generate_program_zig(g);
|
|
755
760
|
fclose(o->output_src);
|
|
@@ -51,7 +51,7 @@ static void write_comment_literalstring(struct generator * g, const symbol *s,
|
|
|
51
51
|
// Check if the literal string contains the target language end comment
|
|
52
52
|
// string. Don't try to be clever here as real-world literal strings
|
|
53
53
|
// are unlikely to contain even partial matches.
|
|
54
|
-
int end_len = strlen(end);
|
|
54
|
+
int end_len = (int)strlen(end);
|
|
55
55
|
if (end_len <= SIZE(s)) {
|
|
56
56
|
for (int i = 0; i <= SIZE(s) - end_len; ++i) {
|
|
57
57
|
for (int j = 0; j < end_len; ++j) {
|
|
@@ -205,6 +205,12 @@ void write_comment_content(struct generator * g, struct node * p,
|
|
|
205
205
|
case c_name:
|
|
206
206
|
write_s(g, p->name->s);
|
|
207
207
|
break;
|
|
208
|
+
case c_slicefrom:
|
|
209
|
+
if (p->literalstring && SIZE(p->literalstring) == 0) {
|
|
210
|
+
write_string(g, "delete");
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
/* FALLTHRU */
|
|
208
214
|
default:
|
|
209
215
|
write_string(g, name_of_token(p->type));
|
|
210
216
|
if (p->name) {
|
|
@@ -553,6 +559,16 @@ extern int repeat_restore(struct node * p) {
|
|
|
553
559
|
return repeat_score(p, 0) >= 2;
|
|
554
560
|
}
|
|
555
561
|
|
|
562
|
+
extern bool
|
|
563
|
+
amongvar_needed(struct node * p)
|
|
564
|
+
{
|
|
565
|
+
if (!p) return false;
|
|
566
|
+
if (p->among && p->among->amongvar_needed) return true;
|
|
567
|
+
return amongvar_needed(p->left) ||
|
|
568
|
+
amongvar_needed(p->right) ||
|
|
569
|
+
amongvar_needed(p->aux);
|
|
570
|
+
}
|
|
571
|
+
|
|
556
572
|
/* Language-independent write routines for simple entities */
|
|
557
573
|
|
|
558
574
|
static void write_hexdigit(struct generator * g, unsigned i) {
|
|
@@ -568,6 +584,13 @@ extern void write_hex(struct generator * g, unsigned i) {
|
|
|
568
584
|
write_hexdigit(g, i); /* hex integer */
|
|
569
585
|
}
|
|
570
586
|
|
|
587
|
+
extern void write_octal3(struct generator * g, unsigned n) {
|
|
588
|
+
assert(n < 256);
|
|
589
|
+
write_char(g, '0' + ((n >> 6) & 0x03));
|
|
590
|
+
write_char(g, '0' + ((n >> 3) & 0x07));
|
|
591
|
+
write_char(g, '0' + (n & 0x07));
|
|
592
|
+
}
|
|
593
|
+
|
|
571
594
|
extern void write_char(struct generator * g, int ch) {
|
|
572
595
|
str_append_ch(g->outbuf, ch); /* character */
|
|
573
596
|
}
|
|
@@ -65,6 +65,17 @@ static void write_varname(struct generator * g, struct name * p) {
|
|
|
65
65
|
write_char(g, '_');
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
for (int i = SIZE(p->s) - 1; i > 0; --i) {
|
|
69
|
+
if (p->s[i] == '_' && p->s[i - 1] == '_') {
|
|
70
|
+
// Ada doesn't allow identifiers containing a double underscore
|
|
71
|
+
// so generate an identifier based on the number instead.
|
|
72
|
+
// A Snowball name must start with a letter so this can't
|
|
73
|
+
// collide.
|
|
74
|
+
write_int(g, p->count);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
68
79
|
{
|
|
69
80
|
char save_initial = p->s[0];
|
|
70
81
|
p->s[0] = toupper(save_initial);
|
|
@@ -83,7 +94,7 @@ static void write_varref(struct generator * g, struct name * p) {
|
|
|
83
94
|
write_varname(g, p);
|
|
84
95
|
}
|
|
85
96
|
|
|
86
|
-
static void write_literal_string(struct generator * g, symbol * p) {
|
|
97
|
+
static void write_literal_string(struct generator * g, const symbol * p) {
|
|
87
98
|
if (SIZE(p) == 0) {
|
|
88
99
|
write_string(g, "\"\"");
|
|
89
100
|
return;
|
|
@@ -296,22 +307,6 @@ static void w(struct generator * g, const char * s) {
|
|
|
296
307
|
writef(g, s, NULL);
|
|
297
308
|
}
|
|
298
309
|
|
|
299
|
-
static int need_among_var(struct node *p) {
|
|
300
|
-
while (p) {
|
|
301
|
-
if (p->type == c_among) {
|
|
302
|
-
return 1;
|
|
303
|
-
}
|
|
304
|
-
if (p->left && need_among_var(p->left)) {
|
|
305
|
-
return 1;
|
|
306
|
-
}
|
|
307
|
-
if (p->aux && need_among_var(p->aux)) {
|
|
308
|
-
return 1;
|
|
309
|
-
}
|
|
310
|
-
p = p->right;
|
|
311
|
-
}
|
|
312
|
-
return 0;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
310
|
static void generate_AE(struct generator * g, struct node * p) {
|
|
316
311
|
const char * s;
|
|
317
312
|
switch (p->type) {
|
|
@@ -835,8 +830,8 @@ static void generate_rightslice(struct generator * g, struct node * p) {
|
|
|
835
830
|
|
|
836
831
|
static void generate_assignto(struct generator * g, struct node * p) {
|
|
837
832
|
write_comment(g, p);
|
|
838
|
-
writef(g, "~
|
|
839
|
-
|
|
833
|
+
writef(g, "~MZ.L~W := Z.L;~N", p);
|
|
834
|
+
writef(g, "~M~V (1 .. Z.L~W) := Z.P (1 .. Z.L);~N", p);
|
|
840
835
|
}
|
|
841
836
|
|
|
842
837
|
static void generate_sliceto(struct generator * g, struct node * p) {
|
|
@@ -1186,7 +1181,7 @@ static void generate_define(struct generator * g, struct node * p) {
|
|
|
1186
1181
|
writef(g, "~Mprocedure ~W (Z : in out Context_Type; Result : out Boolean) is~N", p);
|
|
1187
1182
|
|
|
1188
1183
|
/* Save output. */
|
|
1189
|
-
struct str *
|
|
1184
|
+
struct str * saved_outbuf = g->outbuf;
|
|
1190
1185
|
struct str * saved_declarations = g->declarations;
|
|
1191
1186
|
g->outbuf = str_new();
|
|
1192
1187
|
g->declarations = str_new();
|
|
@@ -1220,17 +1215,20 @@ static void generate_define(struct generator * g, struct node * p) {
|
|
|
1220
1215
|
|
|
1221
1216
|
writef(g, "~-~Mend ~W;~N", p);
|
|
1222
1217
|
|
|
1223
|
-
|
|
1224
|
-
|
|
1218
|
+
struct str * temp = g->outbuf;
|
|
1219
|
+
g->outbuf = saved_outbuf;
|
|
1220
|
+
|
|
1221
|
+
g->margin++;
|
|
1222
|
+
|
|
1223
|
+
if (p->name->has_among) {
|
|
1224
|
+
w(g, "~MA : Integer;~N");
|
|
1225
1225
|
}
|
|
1226
1226
|
|
|
1227
1227
|
if (g->temporary_used) {
|
|
1228
|
-
|
|
1228
|
+
w(g, "~MC : Result_Index;~N");
|
|
1229
1229
|
}
|
|
1230
1230
|
|
|
1231
1231
|
/* Declare localised variables. */
|
|
1232
|
-
struct str * temp = g->outbuf;
|
|
1233
|
-
g->outbuf = saved_output;
|
|
1234
1232
|
for (struct name * name = g->analyser->names; name; name = name->next) {
|
|
1235
1233
|
if (name->local_to == p->name) {
|
|
1236
1234
|
switch (name->type) {
|
|
@@ -1238,29 +1236,32 @@ static void generate_define(struct generator * g, struct node * p) {
|
|
|
1238
1236
|
assert(0);
|
|
1239
1237
|
break;
|
|
1240
1238
|
case t_integer:
|
|
1241
|
-
|
|
1239
|
+
write_margin(g);
|
|
1242
1240
|
write_varname(g, name);
|
|
1243
|
-
w(g,
|
|
1241
|
+
w(g, " : Integer;~N");
|
|
1244
1242
|
break;
|
|
1245
1243
|
case t_boolean:
|
|
1246
|
-
|
|
1244
|
+
write_margin(g);
|
|
1247
1245
|
write_varname(g, name);
|
|
1248
|
-
w(g, " : Boolean
|
|
1246
|
+
w(g, " : Boolean;~N");
|
|
1249
1247
|
break;
|
|
1250
1248
|
}
|
|
1251
1249
|
}
|
|
1252
1250
|
}
|
|
1251
|
+
|
|
1252
|
+
g->margin--;
|
|
1253
|
+
|
|
1253
1254
|
g->outbuf = temp;
|
|
1254
1255
|
|
|
1255
1256
|
if (g->var_number) {
|
|
1256
|
-
str_append(
|
|
1257
|
+
str_append(saved_outbuf, g->declarations);
|
|
1257
1258
|
}
|
|
1258
1259
|
|
|
1259
|
-
str_append(
|
|
1260
|
+
str_append(saved_outbuf, g->outbuf);
|
|
1260
1261
|
str_delete(g->declarations);
|
|
1261
1262
|
str_delete(g->outbuf);
|
|
1262
1263
|
g->declarations = saved_declarations;
|
|
1263
|
-
g->outbuf =
|
|
1264
|
+
g->outbuf = saved_outbuf;
|
|
1264
1265
|
}
|
|
1265
1266
|
|
|
1266
1267
|
static void generate_functionend(struct generator * g, struct node * p) {
|
|
@@ -1274,7 +1275,7 @@ static void generate_substring(struct generator * g, struct node * p) {
|
|
|
1274
1275
|
struct among * x = p->among;
|
|
1275
1276
|
int block = -1;
|
|
1276
1277
|
unsigned int bitmap = 0;
|
|
1277
|
-
struct amongvec * among_cases = x->
|
|
1278
|
+
struct amongvec * among_cases = x->v;
|
|
1278
1279
|
int empty_case = -1;
|
|
1279
1280
|
int n_cases = 0;
|
|
1280
1281
|
symbol cases[2];
|
|
@@ -1484,7 +1485,7 @@ static void generate_debug(struct generator * g, struct node * p) {
|
|
|
1484
1485
|
write_comment(g, p);
|
|
1485
1486
|
g->I[0] = g->debug_count++;
|
|
1486
1487
|
g->I[1] = p->line_number;
|
|
1487
|
-
writef(g, "~
|
|
1488
|
+
writef(g, "~MDebug(Z, ~I0, ~I1);~N", p);
|
|
1488
1489
|
}
|
|
1489
1490
|
|
|
1490
1491
|
static void generate(struct generator * g, struct node * p) {
|
|
@@ -1621,7 +1622,7 @@ static void generate_member_decls(struct generator * g) {
|
|
|
1621
1622
|
}
|
|
1622
1623
|
|
|
1623
1624
|
static int generate_among_string(struct generator * g, struct among * x, int count) {
|
|
1624
|
-
struct amongvec * v = x->
|
|
1625
|
+
struct amongvec * v = x->v;
|
|
1625
1626
|
int limit = count == 0 ? 38 : 80;
|
|
1626
1627
|
|
|
1627
1628
|
g->I[0] = x->number;
|
|
@@ -1645,14 +1646,14 @@ static int generate_among_string(struct generator * g, struct among * x, int cou
|
|
|
1645
1646
|
static int generate_among_table(struct generator * g, struct among * x, int start_pos, int *operation) {
|
|
1646
1647
|
write_comment(g, x->node);
|
|
1647
1648
|
|
|
1648
|
-
struct amongvec * v = x->
|
|
1649
|
+
struct amongvec * v = x->v;
|
|
1649
1650
|
|
|
1650
1651
|
g->I[0] = x->number;
|
|
1651
1652
|
|
|
1652
1653
|
g->I[1] = x->literalstring_count - 1;
|
|
1653
1654
|
w(g, "~N~MA_~I0 : constant Among_Array_Type (0 .. ~I1) := ~+(~N");
|
|
1654
1655
|
|
|
1655
|
-
v = x->
|
|
1656
|
+
v = x->v;
|
|
1656
1657
|
for (int i = 0; i < x->literalstring_count; i++) {
|
|
1657
1658
|
g->I[1] = start_pos;
|
|
1658
1659
|
|
|
@@ -1691,13 +1692,13 @@ static int generate_among_table(struct generator * g, struct among * x, int star
|
|
|
1691
1692
|
static void generate_amongs(struct generator * g) {
|
|
1692
1693
|
if (!g->analyser->amongs) return;
|
|
1693
1694
|
|
|
1694
|
-
struct str *
|
|
1695
|
+
struct str * saved_outbuf = g->outbuf;
|
|
1695
1696
|
g->outbuf = g->declarations;
|
|
1696
1697
|
|
|
1697
1698
|
w(g, "~N~MAmong_String : constant String := ~+");
|
|
1698
1699
|
int count = 0;
|
|
1699
1700
|
for (struct among * x = g->analyser->amongs; x != NULL; x = x->next) {
|
|
1700
|
-
if (x->used) {
|
|
1701
|
+
if (x->used && !x->duplicate) {
|
|
1701
1702
|
count = generate_among_string(g, x, count);
|
|
1702
1703
|
}
|
|
1703
1704
|
}
|
|
@@ -1706,11 +1707,11 @@ static void generate_amongs(struct generator * g) {
|
|
|
1706
1707
|
int operation = 0;
|
|
1707
1708
|
int start_pos = 1;
|
|
1708
1709
|
for (struct among * x = g->analyser->amongs; x != NULL; x = x->next) {
|
|
1709
|
-
if (x->used) {
|
|
1710
|
+
if (x->used && !x->duplicate) {
|
|
1710
1711
|
start_pos = generate_among_table(g, x, start_pos, &operation);
|
|
1711
1712
|
}
|
|
1712
1713
|
}
|
|
1713
|
-
g->outbuf =
|
|
1714
|
+
g->outbuf = saved_outbuf;
|
|
1714
1715
|
|
|
1715
1716
|
if (operation == 0) return;
|
|
1716
1717
|
|
|
@@ -1720,7 +1721,7 @@ static void generate_amongs(struct generator * g) {
|
|
|
1720
1721
|
w(g, "~Mbegin~+~N~M");
|
|
1721
1722
|
w(g, "case Operation is~+~N~M");
|
|
1722
1723
|
for (struct among * x = g->analyser->amongs; x; x = x->next) {
|
|
1723
|
-
struct amongvec * v = x->
|
|
1724
|
+
struct amongvec * v = x->v;
|
|
1724
1725
|
for (int i = 0; i < x->literalstring_count; i++) {
|
|
1725
1726
|
if (v[i].function != NULL) {
|
|
1726
1727
|
operation++;
|
|
@@ -1760,7 +1761,7 @@ static void generate_grouping_table(struct generator * g, struct grouping * q) {
|
|
|
1760
1761
|
write_varname(g, q->name);
|
|
1761
1762
|
w(g, " : constant Grouping_Array (0 .. ~I0) := (~N~+~M");
|
|
1762
1763
|
for (int i = 0; i < size; i++) {
|
|
1763
|
-
|
|
1764
|
+
symbol m = map[i];
|
|
1764
1765
|
if (i) w(g, ",~N~M");
|
|
1765
1766
|
for (int j = 0; j < 8; j++) {
|
|
1766
1767
|
if (j) w(g, ", ");
|
|
@@ -1778,12 +1779,12 @@ static void generate_grouping_table(struct generator * g, struct grouping * q) {
|
|
|
1778
1779
|
}
|
|
1779
1780
|
|
|
1780
1781
|
static void generate_groupings(struct generator * g) {
|
|
1781
|
-
struct str *
|
|
1782
|
+
struct str * saved_outbuf = g->outbuf;
|
|
1782
1783
|
g->outbuf = g->declarations;
|
|
1783
1784
|
for (struct grouping * q = g->analyser->groupings; q; q = q->next) {
|
|
1784
1785
|
generate_grouping_table(g, q);
|
|
1785
1786
|
}
|
|
1786
|
-
g->outbuf =
|
|
1787
|
+
g->outbuf = saved_outbuf;
|
|
1787
1788
|
}
|
|
1788
1789
|
|
|
1789
1790
|
extern void generate_program_ada(struct generator * g) {
|