mutant-melbourne 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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"
|