mutant-melbourne 2.0.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.
- data/LICENSE +25 -0
- data/README.md +69 -0
- data/Rakefile +14 -0
- data/ext/melbourne/.gitignore +3 -0
- data/ext/melbourne/bstring-license.txt +29 -0
- data/ext/melbourne/bstrlib.c +2687 -0
- data/ext/melbourne/bstrlib.h +267 -0
- data/ext/melbourne/encoding_compat.cpp +188 -0
- data/ext/melbourne/encoding_compat.hpp +57 -0
- data/ext/melbourne/extconf.rb +87 -0
- data/ext/melbourne/grammar18.cpp +11280 -0
- data/ext/melbourne/grammar18.hpp +13 -0
- data/ext/melbourne/grammar18.y +6088 -0
- data/ext/melbourne/grammar19.cpp +12420 -0
- data/ext/melbourne/grammar19.hpp +11 -0
- data/ext/melbourne/grammar19.y +7113 -0
- data/ext/melbourne/lex.c.blt +152 -0
- data/ext/melbourne/lex.c.tab +136 -0
- data/ext/melbourne/local_state.hpp +43 -0
- data/ext/melbourne/melbourne.cpp +88 -0
- data/ext/melbourne/melbourne.hpp +19 -0
- data/ext/melbourne/node18.hpp +262 -0
- data/ext/melbourne/node19.hpp +271 -0
- data/ext/melbourne/node_types.rb +304 -0
- data/ext/melbourne/node_types18.cpp +255 -0
- data/ext/melbourne/node_types18.hpp +129 -0
- data/ext/melbourne/node_types19.cpp +249 -0
- data/ext/melbourne/node_types19.hpp +126 -0
- data/ext/melbourne/parser_state18.hpp +181 -0
- data/ext/melbourne/parser_state19.hpp +251 -0
- data/ext/melbourne/quark.cpp +42 -0
- data/ext/melbourne/quark.hpp +45 -0
- data/ext/melbourne/symbols.cpp +224 -0
- data/ext/melbourne/symbols.hpp +119 -0
- data/ext/melbourne/var_table18.cpp +83 -0
- data/ext/melbourne/var_table18.hpp +33 -0
- data/ext/melbourne/var_table19.cpp +65 -0
- data/ext/melbourne/var_table19.hpp +35 -0
- data/ext/melbourne/visitor18.cpp +963 -0
- data/ext/melbourne/visitor18.hpp +12 -0
- data/ext/melbourne/visitor19.cpp +960 -0
- data/ext/melbourne/visitor19.hpp +15 -0
- data/lib/compiler/ast/constants.rb +81 -0
- data/lib/compiler/ast/control_flow.rb +290 -0
- data/lib/compiler/ast/data.rb +14 -0
- data/lib/compiler/ast/definitions.rb +749 -0
- data/lib/compiler/ast/encoding.rb +18 -0
- data/lib/compiler/ast/exceptions.rb +138 -0
- data/lib/compiler/ast/file.rb +11 -0
- data/lib/compiler/ast/grapher.rb +89 -0
- data/lib/compiler/ast/literals.rb +207 -0
- data/lib/compiler/ast/node.rb +362 -0
- data/lib/compiler/ast/operators.rb +106 -0
- data/lib/compiler/ast/self.rb +15 -0
- data/lib/compiler/ast/sends.rb +615 -0
- data/lib/compiler/ast/transforms.rb +298 -0
- data/lib/compiler/ast/values.rb +88 -0
- data/lib/compiler/ast/variables.rb +351 -0
- data/lib/compiler/ast.rb +20 -0
- data/lib/compiler/locals.rb +109 -0
- data/lib/melbourne/processor.rb +651 -0
- data/lib/melbourne/version.rb +3 -0
- data/lib/melbourne.rb +143 -0
- metadata +112 -0
@@ -0,0 +1,152 @@
|
|
1
|
+
/* C code produced by gperf version 3.0.4 */
|
2
|
+
/* Command-line: gperf -C -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' defs/keywords */
|
3
|
+
|
4
|
+
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
5
|
+
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
|
6
|
+
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
|
7
|
+
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
|
8
|
+
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
|
9
|
+
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
|
10
|
+
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
|
11
|
+
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
|
12
|
+
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
|
13
|
+
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
|
14
|
+
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
|
15
|
+
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
|
16
|
+
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
|
17
|
+
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
|
18
|
+
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
|
19
|
+
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
|
20
|
+
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
|
21
|
+
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
|
22
|
+
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
|
23
|
+
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
|
24
|
+
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
|
25
|
+
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
|
26
|
+
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
|
27
|
+
/* The character set is not based on ISO-646. */
|
28
|
+
error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
|
29
|
+
#endif
|
30
|
+
|
31
|
+
struct kwtable {const char *name; int id[2]; enum lex_state_e state;};
|
32
|
+
const struct kwtable *rb_reserved_word(const char *, unsigned int);
|
33
|
+
static const struct kwtable *reserved_word(const char *, unsigned int);
|
34
|
+
#define rb_reserved_word(str, len) reserved_word(str, len)
|
35
|
+
struct kwtable;
|
36
|
+
|
37
|
+
#define TOTAL_KEYWORDS 41
|
38
|
+
#define MIN_WORD_LENGTH 2
|
39
|
+
#define MAX_WORD_LENGTH 12
|
40
|
+
#define MIN_HASH_VALUE 8
|
41
|
+
#define MAX_HASH_VALUE 50
|
42
|
+
/* maximum key range = 43, duplicates = 0 */
|
43
|
+
|
44
|
+
static inline unsigned int hash(register const char* str, register unsigned int len)
|
45
|
+
{
|
46
|
+
static const unsigned char asso_values[] =
|
47
|
+
{
|
48
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
49
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
50
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
51
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
52
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
53
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
54
|
+
51, 51, 51, 26, 51, 51, 14, 51, 16, 8,
|
55
|
+
11, 13, 51, 51, 51, 51, 10, 51, 13, 51,
|
56
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
57
|
+
51, 51, 51, 51, 51, 11, 51, 13, 1, 26,
|
58
|
+
4, 1, 8, 28, 51, 23, 51, 1, 1, 27,
|
59
|
+
5, 19, 21, 51, 8, 3, 3, 11, 51, 21,
|
60
|
+
24, 16, 51, 51, 51, 51, 51, 51, 51, 51,
|
61
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
62
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
63
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
64
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
65
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
66
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
67
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
68
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
69
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
70
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
71
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
72
|
+
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
73
|
+
51, 51, 51, 51, 51, 51
|
74
|
+
};
|
75
|
+
register int hval = len;
|
76
|
+
|
77
|
+
switch (hval)
|
78
|
+
{
|
79
|
+
default:
|
80
|
+
hval += asso_values[(unsigned char)str[2]];
|
81
|
+
/*FALLTHROUGH*/
|
82
|
+
case 2:
|
83
|
+
case 1:
|
84
|
+
hval += asso_values[(unsigned char)str[0]];
|
85
|
+
break;
|
86
|
+
}
|
87
|
+
return hval + asso_values[(unsigned char)str[len - 1]];
|
88
|
+
}
|
89
|
+
|
90
|
+
const struct kwtable* rb_reserved_word(register const char* str, register unsigned int len)
|
91
|
+
{
|
92
|
+
static const struct kwtable wordlist[] =
|
93
|
+
{
|
94
|
+
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
95
|
+
{"break", {keyword_break, keyword_break}, EXPR_MID},
|
96
|
+
{"else", {keyword_else, keyword_else}, EXPR_BEG},
|
97
|
+
{"nil", {keyword_nil, keyword_nil}, EXPR_END},
|
98
|
+
{"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG},
|
99
|
+
{"end", {keyword_end, keyword_end}, EXPR_END},
|
100
|
+
{"then", {keyword_then, keyword_then}, EXPR_BEG},
|
101
|
+
{"not", {keyword_not, keyword_not}, EXPR_ARG},
|
102
|
+
{"false", {keyword_false, keyword_false}, EXPR_END},
|
103
|
+
{"self", {keyword_self, keyword_self}, EXPR_END},
|
104
|
+
{"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE},
|
105
|
+
{"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID},
|
106
|
+
{"true", {keyword_true, keyword_true}, EXPR_END},
|
107
|
+
{"until", {keyword_until, modifier_until}, EXPR_VALUE},
|
108
|
+
{"unless", {keyword_unless, modifier_unless}, EXPR_VALUE},
|
109
|
+
{"return", {keyword_return, keyword_return}, EXPR_MID},
|
110
|
+
{"def", {keyword_def, keyword_def}, EXPR_FNAME},
|
111
|
+
{"and", {keyword_and, keyword_and}, EXPR_VALUE},
|
112
|
+
{"do", {keyword_do, keyword_do}, EXPR_BEG},
|
113
|
+
{"yield", {keyword_yield, keyword_yield}, EXPR_ARG},
|
114
|
+
{"for", {keyword_for, keyword_for}, EXPR_VALUE},
|
115
|
+
{"undef", {keyword_undef, keyword_undef}, EXPR_FNAME},
|
116
|
+
{"or", {keyword_or, keyword_or}, EXPR_VALUE},
|
117
|
+
{"in", {keyword_in, keyword_in}, EXPR_VALUE},
|
118
|
+
{"when", {keyword_when, keyword_when}, EXPR_VALUE},
|
119
|
+
{"retry", {keyword_retry, keyword_retry}, EXPR_END},
|
120
|
+
{"if", {keyword_if, modifier_if}, EXPR_VALUE},
|
121
|
+
{"case", {keyword_case, keyword_case}, EXPR_VALUE},
|
122
|
+
{"redo", {keyword_redo, keyword_redo}, EXPR_END},
|
123
|
+
{"next", {keyword_next, keyword_next}, EXPR_MID},
|
124
|
+
{"super", {keyword_super, keyword_super}, EXPR_ARG},
|
125
|
+
{"module", {keyword_module, keyword_module}, EXPR_VALUE},
|
126
|
+
{"begin", {keyword_begin, keyword_begin}, EXPR_BEG},
|
127
|
+
{"__LINE__", {keyword__LINE__, keyword__LINE__}, EXPR_END},
|
128
|
+
{"__FILE__", {keyword__FILE__, keyword__FILE__}, EXPR_END},
|
129
|
+
{"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END},
|
130
|
+
{"END", {keyword_END, keyword_END}, EXPR_END},
|
131
|
+
{"alias", {keyword_alias, keyword_alias}, EXPR_FNAME},
|
132
|
+
{"BEGIN", {keyword_BEGIN, keyword_BEGIN}, EXPR_END},
|
133
|
+
{"defined?", {keyword_defined, keyword_defined}, EXPR_ARG},
|
134
|
+
{"class", {keyword_class, keyword_class}, EXPR_CLASS},
|
135
|
+
{""}, {""},
|
136
|
+
{"while", {keyword_while, modifier_while}, EXPR_VALUE}
|
137
|
+
};
|
138
|
+
|
139
|
+
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
140
|
+
{
|
141
|
+
register int key = hash(str, len);
|
142
|
+
|
143
|
+
if(key <= MAX_HASH_VALUE && key >= 0)
|
144
|
+
{
|
145
|
+
register const char *s = wordlist[key].name;
|
146
|
+
|
147
|
+
if(*str == *s && !strcmp(str + 1, s + 1))
|
148
|
+
return &wordlist[key];
|
149
|
+
}
|
150
|
+
}
|
151
|
+
return 0;
|
152
|
+
}
|
@@ -0,0 +1,136 @@
|
|
1
|
+
/* C code produced by gperf version 2.7.2 */
|
2
|
+
/* Command-line: gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' ./keywords */
|
3
|
+
struct kwtable {
|
4
|
+
int id[2];
|
5
|
+
enum lex_state_e state;
|
6
|
+
char name[16];
|
7
|
+
};
|
8
|
+
|
9
|
+
#define TOTAL_KEYWORDS 40
|
10
|
+
#define MIN_WORD_LENGTH 2
|
11
|
+
#define MAX_WORD_LENGTH 8
|
12
|
+
#define MIN_HASH_VALUE 6
|
13
|
+
#define MAX_HASH_VALUE 55
|
14
|
+
/* maximum key range = 50, duplicates = 0 */
|
15
|
+
|
16
|
+
#ifdef __GNUC__
|
17
|
+
__inline
|
18
|
+
#else
|
19
|
+
#ifdef __cplusplus
|
20
|
+
inline
|
21
|
+
#endif
|
22
|
+
#endif
|
23
|
+
static unsigned int
|
24
|
+
hash (register const char *str, register unsigned int len)
|
25
|
+
{
|
26
|
+
static const unsigned char asso_values[] =
|
27
|
+
{
|
28
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
29
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
30
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
31
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
32
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
33
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
34
|
+
56, 56, 56, 11, 56, 56, 36, 56, 1, 37,
|
35
|
+
31, 1, 56, 56, 56, 56, 29, 56, 1, 56,
|
36
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
37
|
+
56, 56, 56, 56, 56, 1, 56, 32, 1, 2,
|
38
|
+
1, 1, 4, 23, 56, 17, 56, 20, 9, 2,
|
39
|
+
9, 26, 14, 56, 5, 1, 1, 16, 56, 21,
|
40
|
+
20, 9, 56, 56, 56, 56, 56, 56, 56, 56,
|
41
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
42
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
43
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
44
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
45
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
46
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
47
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
48
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
49
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
50
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
51
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
52
|
+
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
|
53
|
+
56, 56, 56, 56, 56, 56
|
54
|
+
};
|
55
|
+
register int hval = len;
|
56
|
+
|
57
|
+
switch (hval)
|
58
|
+
{
|
59
|
+
default:
|
60
|
+
case 3:
|
61
|
+
hval += asso_values[(unsigned char)str[2]];
|
62
|
+
case 2:
|
63
|
+
case 1:
|
64
|
+
hval += asso_values[(unsigned char)str[0]];
|
65
|
+
break;
|
66
|
+
}
|
67
|
+
return hval + asso_values[(unsigned char)str[len - 1]];
|
68
|
+
}
|
69
|
+
|
70
|
+
#ifdef __GNUC__
|
71
|
+
__inline
|
72
|
+
#endif
|
73
|
+
const struct kwtable *
|
74
|
+
mel_reserved_word (register const char *str, register unsigned int len)
|
75
|
+
{
|
76
|
+
static const struct kwtable wordlist[] =
|
77
|
+
{
|
78
|
+
{{0, 0}}, {{0, 0}}, {{0, 0}}, {{0, 0}}, {{0, 0}}, {{0, 0}},
|
79
|
+
{{kEND, kEND}, EXPR_END, "end"},
|
80
|
+
{{kELSE, kELSE}, EXPR_BEG, "else"},
|
81
|
+
{{kCASE, kCASE}, EXPR_BEG, "case"},
|
82
|
+
{{kENSURE, kENSURE}, EXPR_BEG, "ensure"},
|
83
|
+
{{kMODULE, kMODULE}, EXPR_BEG, "module"},
|
84
|
+
{{kELSIF, kELSIF}, EXPR_BEG, "elsif"},
|
85
|
+
{{kDEF, kDEF}, EXPR_FNAME, "def"},
|
86
|
+
{{kRESCUE, kRESCUE_MOD}, EXPR_MID, "rescue"},
|
87
|
+
{{kNOT, kNOT}, EXPR_BEG, "not"},
|
88
|
+
{{kTHEN, kTHEN}, EXPR_BEG, "then"},
|
89
|
+
{{kYIELD, kYIELD}, EXPR_ARG, "yield"},
|
90
|
+
{{kFOR, kFOR}, EXPR_BEG, "for"},
|
91
|
+
{{kSELF, kSELF}, EXPR_END, "self"},
|
92
|
+
{{kFALSE, kFALSE}, EXPR_END, "false"},
|
93
|
+
{{kRETRY, kRETRY}, EXPR_END, "retry"},
|
94
|
+
{{kRETURN, kRETURN}, EXPR_MID, "return"},
|
95
|
+
{{kTRUE, kTRUE}, EXPR_END, "true"},
|
96
|
+
{{kIF, kIF_MOD}, EXPR_BEG, "if"},
|
97
|
+
{{kDEFINED, kDEFINED}, EXPR_ARG, "defined?"},
|
98
|
+
{{kSUPER, kSUPER}, EXPR_ARG, "super"},
|
99
|
+
{{kUNDEF, kUNDEF}, EXPR_FNAME, "undef"},
|
100
|
+
{{kBREAK, kBREAK}, EXPR_MID, "break"},
|
101
|
+
{{kIN, kIN}, EXPR_BEG, "in"},
|
102
|
+
{{kDO, kDO}, EXPR_BEG, "do"},
|
103
|
+
{{kNIL, kNIL}, EXPR_END, "nil"},
|
104
|
+
{{kUNTIL, kUNTIL_MOD}, EXPR_BEG, "until"},
|
105
|
+
{{kUNLESS, kUNLESS_MOD}, EXPR_BEG, "unless"},
|
106
|
+
{{kOR, kOR}, EXPR_BEG, "or"},
|
107
|
+
{{kNEXT, kNEXT}, EXPR_MID, "next"},
|
108
|
+
{{kWHEN, kWHEN}, EXPR_BEG, "when"},
|
109
|
+
{{kREDO, kREDO}, EXPR_END, "redo"},
|
110
|
+
{{kAND, kAND}, EXPR_BEG, "and"},
|
111
|
+
{{kBEGIN, kBEGIN}, EXPR_BEG, "begin"},
|
112
|
+
{{k__LINE__, k__LINE__}, EXPR_END, "__LINE__"},
|
113
|
+
{{kCLASS, kCLASS}, EXPR_CLASS, "class"},
|
114
|
+
{{k__FILE__, k__FILE__}, EXPR_END, "__FILE__"},
|
115
|
+
{{klEND, klEND}, EXPR_END, "END"},
|
116
|
+
{{klBEGIN, klBEGIN}, EXPR_END, "BEGIN"},
|
117
|
+
{{kWHILE, kWHILE_MOD}, EXPR_BEG, "while"},
|
118
|
+
{{0, 0}}, {{0, 0}}, {{0, 0}}, {{0, 0}}, {{0, 0}},
|
119
|
+
{{0, 0}}, {{0, 0}}, {{0, 0}}, {{0, 0}}, {{0, 0}},
|
120
|
+
{{kALIAS, kALIAS}, EXPR_FNAME, "alias"}
|
121
|
+
};
|
122
|
+
|
123
|
+
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
124
|
+
{
|
125
|
+
register int key = hash (str, len);
|
126
|
+
|
127
|
+
if (key <= MAX_HASH_VALUE && key >= 0)
|
128
|
+
{
|
129
|
+
register const char *s = wordlist[key].name;
|
130
|
+
|
131
|
+
if (*str == *s && !strcmp (str + 1, s + 1))
|
132
|
+
return &wordlist[key];
|
133
|
+
}
|
134
|
+
}
|
135
|
+
return 0;
|
136
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#ifndef MEL_LOCALSTATE_HPP
|
2
|
+
#define MEL_LOCALSTATE_HPP
|
3
|
+
|
4
|
+
#include "var_table18.hpp"
|
5
|
+
|
6
|
+
namespace melbourne {
|
7
|
+
namespace grammar18 {
|
8
|
+
struct LocalState {
|
9
|
+
LocalState* prev;
|
10
|
+
var_table local_vars;
|
11
|
+
var_table block_vars;
|
12
|
+
|
13
|
+
LocalState(LocalState* prev)
|
14
|
+
: prev(prev)
|
15
|
+
, local_vars(var_table_create())
|
16
|
+
, block_vars(0)
|
17
|
+
{}
|
18
|
+
|
19
|
+
~LocalState() {
|
20
|
+
var_table_destroy(local_vars);
|
21
|
+
if(block_vars) {
|
22
|
+
var_table_destroy(block_vars);
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
bool blocks_p() {
|
27
|
+
return block_vars != NULL;
|
28
|
+
}
|
29
|
+
|
30
|
+
static LocalState* push(LocalState* cur) {
|
31
|
+
return new LocalState(cur);
|
32
|
+
}
|
33
|
+
|
34
|
+
static LocalState* pop(LocalState* cur) {
|
35
|
+
LocalState* tmp = cur->prev;
|
36
|
+
delete cur;
|
37
|
+
return tmp;
|
38
|
+
}
|
39
|
+
};
|
40
|
+
};
|
41
|
+
};
|
42
|
+
|
43
|
+
#endif
|
@@ -0,0 +1,88 @@
|
|
1
|
+
/* We are well-behaved citizens of the C-extension State
|
2
|
+
* so we let the C-API know this so it will not penalize
|
3
|
+
* us with unnecessary caching.
|
4
|
+
*/
|
5
|
+
|
6
|
+
#include "melbourne.hpp"
|
7
|
+
#include "grammar18.hpp"
|
8
|
+
#include "grammar19.hpp"
|
9
|
+
#include "symbols.hpp"
|
10
|
+
|
11
|
+
#ifdef __cplusplus
|
12
|
+
extern "C" {
|
13
|
+
#endif
|
14
|
+
|
15
|
+
VALUE melbourne18_string_to_ast(VALUE self, VALUE source, VALUE name, VALUE line) {
|
16
|
+
StringValue(source);
|
17
|
+
StringValue(name);
|
18
|
+
bstring b_str = blk2bstr(RSTRING_PTR(source), (int)RSTRING_LEN(source));
|
19
|
+
VALUE result = melbourne::grammar18::string_to_ast(self,
|
20
|
+
RSTRING_PTR(name), b_str, FIX2INT(line));
|
21
|
+
bdestroy(b_str);
|
22
|
+
|
23
|
+
return result;
|
24
|
+
}
|
25
|
+
|
26
|
+
VALUE melbourne18_file_to_ast(VALUE self, VALUE fname, VALUE start) {
|
27
|
+
StringValue(fname);
|
28
|
+
|
29
|
+
char* c_name = RSTRING_PTR(fname);
|
30
|
+
|
31
|
+
FILE *file = fopen(c_name, "r");
|
32
|
+
if(file) {
|
33
|
+
VALUE result = melbourne::grammar18::file_to_ast(self,
|
34
|
+
RSTRING_PTR(fname), file, FIX2INT(start));
|
35
|
+
fclose(file);
|
36
|
+
|
37
|
+
return result;
|
38
|
+
} else {
|
39
|
+
rb_raise(rb_eLoadError, "%s -- %s", strerror(errno), c_name);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
VALUE melbourne19_string_to_ast(VALUE self, VALUE source, VALUE name, VALUE line) {
|
44
|
+
StringValue(source);
|
45
|
+
StringValue(name);
|
46
|
+
VALUE result = melbourne::grammar19::string_to_ast(self, name, source, line);
|
47
|
+
|
48
|
+
return result;
|
49
|
+
}
|
50
|
+
|
51
|
+
VALUE melbourne19_file_to_ast(VALUE self, VALUE fname, VALUE start) {
|
52
|
+
StringValue(fname);
|
53
|
+
|
54
|
+
int fd = open(RSTRING_PTR(fname), O_RDONLY);
|
55
|
+
if(fd != -1) {
|
56
|
+
VALUE result = melbourne::grammar19::file_to_ast(self,
|
57
|
+
RSTRING_PTR(fname), fd, FIX2INT(start));
|
58
|
+
close(fd);
|
59
|
+
|
60
|
+
return result;
|
61
|
+
} else {
|
62
|
+
rb_raise(rb_eLoadError, "no such file to load -- %s", RSTRING_PTR(fname));
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
void Init_melbourne(void) {
|
67
|
+
VALUE rb_cMelbourne;
|
68
|
+
|
69
|
+
melbourne::init_symbols20();
|
70
|
+
|
71
|
+
#ifndef RUBINIUS
|
72
|
+
VALUE rb_mRubinius = rb_const_get(rb_cObject, rb_intern("Rubinius"));
|
73
|
+
#endif
|
74
|
+
|
75
|
+
rb_cMelbourne = rb_define_class_under(rb_mRubinius, "Melbourne", rb_cObject);
|
76
|
+
rb_define_method(rb_cMelbourne, "string_to_ast_18",
|
77
|
+
RUBY_METHOD_FUNC(melbourne18_string_to_ast), 3);
|
78
|
+
rb_define_method(rb_cMelbourne, "file_to_ast_18",
|
79
|
+
RUBY_METHOD_FUNC(melbourne18_file_to_ast), 2);
|
80
|
+
rb_define_method(rb_cMelbourne, "string_to_ast_19",
|
81
|
+
RUBY_METHOD_FUNC(melbourne19_string_to_ast), 3);
|
82
|
+
rb_define_method(rb_cMelbourne, "file_to_ast_19",
|
83
|
+
RUBY_METHOD_FUNC(melbourne19_file_to_ast), 2);
|
84
|
+
}
|
85
|
+
|
86
|
+
#ifdef __cplusplus
|
87
|
+
} /* extern "C" { */
|
88
|
+
#endif
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <errno.h>
|
3
|
+
#include <ctype.h>
|
4
|
+
#include <string.h>
|
5
|
+
#include <strings.h>
|
6
|
+
#include <stdbool.h>
|
7
|
+
#include <stdint.h>
|
8
|
+
#include <assert.h>
|
9
|
+
#include <stdlib.h>
|
10
|
+
#include <unistd.h>
|
11
|
+
#include <fcntl.h>
|
12
|
+
#include <sys/types.h>
|
13
|
+
#ifdef HAVE_ALLOCA_H
|
14
|
+
#include <alloca.h>
|
15
|
+
#endif
|
16
|
+
|
17
|
+
#define RSTRING_NOT_MODIFIED 1
|
18
|
+
|
19
|
+
#include "ruby.h"
|