Created
June 13, 2023 09:03
-
-
Save zonuexe/43c374155ba6bb7f2b1ec507340d9c2e to your computer and use it in GitHub Desktop.
Ruby 1.9で,なしの改行区切りする parse.y パッチ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/defs/keywords b/defs/keywords | |
index 1b5719a..38679dc 100644 | |
--- a/defs/keywords | |
+++ b/defs/keywords | |
@@ -17,7 +17,7 @@ alias, {keyword_alias, keyword_alias}, EXPR_FNAME | |
and, {keyword_and, keyword_and}, EXPR_VALUE | |
begin, {keyword_begin, keyword_begin}, EXPR_BEG | |
break, {keyword_break, keyword_break}, EXPR_MID | |
-case, {keyword_case, keyword_case}, EXPR_VALUE | |
+case, {keyword_case, modifier_case}, EXPR_VALUE | |
class, {keyword_class, keyword_class}, EXPR_CLASS | |
def, {keyword_def, keyword_def}, EXPR_FNAME | |
defined?, {keyword_defined, keyword_defined}, EXPR_ARG | |
diff --git a/defs/lex.c.src b/defs/lex.c.src | |
index 1b5719a..38679dc 100644 | |
--- a/defs/lex.c.src | |
+++ b/defs/lex.c.src | |
@@ -17,7 +17,7 @@ alias, {keyword_alias, keyword_alias}, EXPR_FNAME | |
and, {keyword_and, keyword_and}, EXPR_VALUE | |
begin, {keyword_begin, keyword_begin}, EXPR_BEG | |
break, {keyword_break, keyword_break}, EXPR_MID | |
-case, {keyword_case, keyword_case}, EXPR_VALUE | |
+case, {keyword_case, modifier_case}, EXPR_VALUE | |
class, {keyword_class, keyword_class}, EXPR_CLASS | |
def, {keyword_def, keyword_def}, EXPR_FNAME | |
defined?, {keyword_defined, keyword_defined}, EXPR_ARG | |
diff --git a/enum.c b/enum.c | |
index fc8a3c3..5b8703f 100644 | |
--- a/enum.c | |
+++ b/enum.c | |
@@ -684,7 +684,7 @@ first_i(VALUE i, VALUE *params, int argc, VALUE *argv) | |
{ | |
ENUM_WANT_SVALUE(); | |
- if (NIL_P(params[1])) { | |
+ if (NIL_P(params[0])) { | |
params[1] = i; | |
rb_iter_break(); | |
} | |
diff --git a/eval.c b/eval.c | |
index 95d1b8c..bb87c68 100644 | |
--- a/eval.c | |
+++ b/eval.c | |
@@ -137,6 +137,7 @@ ruby_cleanup(volatile int ex) | |
SAVE_ROOT_JMPBUF(th, { RUBY_VM_CHECK_INTS(); }); | |
} | |
POP_TAG(); | |
+ // fprintf(stderr, "%p\n", th->errinfo); | |
errs[1] = th->errinfo; | |
th->safe_level = 0; | |
diff --git a/io.c b/io.c | |
index 6eff580..6f46a40 100644 | |
--- a/io.c | |
+++ b/io.c | |
@@ -8002,7 +8002,7 @@ rb_io_s_binread(int argc, VALUE *argv, VALUE io) | |
arg.io = rb_io_open(argv[0], rb_str_new_cstr("rb:ASCII-8BIT"), Qnil, Qnil); | |
if (NIL_P(arg.io)) return Qnil; | |
arg.argv = argv+1; | |
- arg.argc = (argc > 1) ? 1 : 0; | |
+ arg.argc = (argc > 2) ? 2 : argc; | |
if (!NIL_P(offset)) { | |
rb_io_seek(arg.io, offset, SEEK_SET); | |
} | |
diff --git a/lex.c.blt b/lex.c.blt | |
index 1ae8099..5eeca6e 100644 | |
--- a/lex.c.blt | |
+++ b/lex.c.blt | |
@@ -1,5 +1,5 @@ | |
-/* C code produced by gperf version 3.0.4 */ | |
-/* Command-line: gperf -C -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' defs/keywords */ | |
+/* C code produced by gperf version 3.0.3 */ | |
+/* Command-line: gperf -C -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' ../defs/keywords */ | |
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ | |
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ | |
@@ -28,14 +28,14 @@ | |
error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>." | |
#endif | |
-#line 1 "defs/keywords" | |
+#line 1 "../defs/keywords" | |
struct kwtable {const char *name; int id[2]; enum lex_state_e state;}; | |
const struct kwtable *rb_reserved_word(const char *, unsigned int); | |
#ifndef RIPPER | |
static const struct kwtable *reserved_word(const char *, unsigned int); | |
#define rb_reserved_word(str, len) reserved_word(str, len) | |
-#line 9 "defs/keywords" | |
+#line 9 "../defs/keywords" | |
struct kwtable; | |
#define TOTAL_KEYWORDS 41 | |
@@ -103,7 +103,7 @@ hash (str, len) | |
#ifdef __GNUC__ | |
__inline | |
-#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ | |
+#ifdef __GNUC_STDC_INLINE__ | |
__attribute__ ((__gnu_inline__)) | |
#endif | |
#endif | |
@@ -115,88 +115,88 @@ rb_reserved_word (str, len) | |
static const struct kwtable wordlist[] = | |
{ | |
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, | |
-#line 19 "defs/keywords" | |
+#line 19 "../defs/keywords" | |
{"break", {keyword_break, keyword_break}, EXPR_MID}, | |
-#line 25 "defs/keywords" | |
+#line 25 "../defs/keywords" | |
{"else", {keyword_else, keyword_else}, EXPR_BEG}, | |
-#line 35 "defs/keywords" | |
+#line 35 "../defs/keywords" | |
{"nil", {keyword_nil, keyword_nil}, EXPR_END}, | |
-#line 28 "defs/keywords" | |
+#line 28 "../defs/keywords" | |
{"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG}, | |
-#line 27 "defs/keywords" | |
+#line 27 "../defs/keywords" | |
{"end", {keyword_end, keyword_end}, EXPR_END}, | |
-#line 44 "defs/keywords" | |
+#line 44 "../defs/keywords" | |
{"then", {keyword_then, keyword_then}, EXPR_BEG}, | |
-#line 36 "defs/keywords" | |
+#line 36 "../defs/keywords" | |
{"not", {keyword_not, keyword_not}, EXPR_ARG}, | |
-#line 29 "defs/keywords" | |
+#line 29 "../defs/keywords" | |
{"false", {keyword_false, keyword_false}, EXPR_END}, | |
-#line 42 "defs/keywords" | |
+#line 42 "../defs/keywords" | |
{"self", {keyword_self, keyword_self}, EXPR_END}, | |
-#line 26 "defs/keywords" | |
+#line 26 "../defs/keywords" | |
{"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE}, | |
-#line 39 "defs/keywords" | |
+#line 39 "../defs/keywords" | |
{"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID}, | |
-#line 45 "defs/keywords" | |
+#line 45 "../defs/keywords" | |
{"true", {keyword_true, keyword_true}, EXPR_END}, | |
-#line 48 "defs/keywords" | |
+#line 48 "../defs/keywords" | |
{"until", {keyword_until, modifier_until}, EXPR_VALUE}, | |
-#line 47 "defs/keywords" | |
+#line 47 "../defs/keywords" | |
{"unless", {keyword_unless, modifier_unless}, EXPR_VALUE}, | |
-#line 41 "defs/keywords" | |
+#line 41 "../defs/keywords" | |
{"return", {keyword_return, keyword_return}, EXPR_MID}, | |
-#line 22 "defs/keywords" | |
+#line 22 "../defs/keywords" | |
{"def", {keyword_def, keyword_def}, EXPR_FNAME}, | |
-#line 17 "defs/keywords" | |
+#line 17 "../defs/keywords" | |
{"and", {keyword_and, keyword_and}, EXPR_VALUE}, | |
-#line 24 "defs/keywords" | |
+#line 24 "../defs/keywords" | |
{"do", {keyword_do, keyword_do}, EXPR_BEG}, | |
-#line 51 "defs/keywords" | |
+#line 51 "../defs/keywords" | |
{"yield", {keyword_yield, keyword_yield}, EXPR_ARG}, | |
-#line 30 "defs/keywords" | |
+#line 30 "../defs/keywords" | |
{"for", {keyword_for, keyword_for}, EXPR_VALUE}, | |
-#line 46 "defs/keywords" | |
+#line 46 "../defs/keywords" | |
{"undef", {keyword_undef, keyword_undef}, EXPR_FNAME}, | |
-#line 37 "defs/keywords" | |
+#line 37 "../defs/keywords" | |
{"or", {keyword_or, keyword_or}, EXPR_VALUE}, | |
-#line 32 "defs/keywords" | |
+#line 32 "../defs/keywords" | |
{"in", {keyword_in, keyword_in}, EXPR_VALUE}, | |
-#line 49 "defs/keywords" | |
+#line 49 "../defs/keywords" | |
{"when", {keyword_when, keyword_when}, EXPR_VALUE}, | |
-#line 40 "defs/keywords" | |
+#line 40 "../defs/keywords" | |
{"retry", {keyword_retry, keyword_retry}, EXPR_END}, | |
-#line 31 "defs/keywords" | |
+#line 31 "../defs/keywords" | |
{"if", {keyword_if, modifier_if}, EXPR_VALUE}, | |
-#line 20 "defs/keywords" | |
- {"case", {keyword_case, keyword_case}, EXPR_VALUE}, | |
-#line 38 "defs/keywords" | |
+#line 20 "../defs/keywords" | |
+ {"case", {keyword_case, modifier_case}, EXPR_VALUE}, | |
+#line 38 "../defs/keywords" | |
{"redo", {keyword_redo, keyword_redo}, EXPR_END}, | |
-#line 34 "defs/keywords" | |
+#line 34 "../defs/keywords" | |
{"next", {keyword_next, keyword_next}, EXPR_MID}, | |
-#line 43 "defs/keywords" | |
+#line 43 "../defs/keywords" | |
{"super", {keyword_super, keyword_super}, EXPR_ARG}, | |
-#line 33 "defs/keywords" | |
+#line 33 "../defs/keywords" | |
{"module", {keyword_module, keyword_module}, EXPR_VALUE}, | |
-#line 18 "defs/keywords" | |
+#line 18 "../defs/keywords" | |
{"begin", {keyword_begin, keyword_begin}, EXPR_BEG}, | |
-#line 12 "defs/keywords" | |
+#line 12 "../defs/keywords" | |
{"__LINE__", {keyword__LINE__, keyword__LINE__}, EXPR_END}, | |
-#line 13 "defs/keywords" | |
+#line 13 "../defs/keywords" | |
{"__FILE__", {keyword__FILE__, keyword__FILE__}, EXPR_END}, | |
-#line 11 "defs/keywords" | |
+#line 11 "../defs/keywords" | |
{"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END}, | |
-#line 15 "defs/keywords" | |
+#line 15 "../defs/keywords" | |
{"END", {keyword_END, keyword_END}, EXPR_END}, | |
-#line 16 "defs/keywords" | |
+#line 16 "../defs/keywords" | |
{"alias", {keyword_alias, keyword_alias}, EXPR_FNAME}, | |
-#line 14 "defs/keywords" | |
+#line 14 "../defs/keywords" | |
{"BEGIN", {keyword_BEGIN, keyword_BEGIN}, EXPR_END}, | |
-#line 23 "defs/keywords" | |
+#line 23 "../defs/keywords" | |
{"defined?", {keyword_defined, keyword_defined}, EXPR_ARG}, | |
-#line 21 "defs/keywords" | |
+#line 21 "../defs/keywords" | |
{"class", {keyword_class, keyword_class}, EXPR_CLASS}, | |
{""}, {""}, | |
-#line 50 "defs/keywords" | |
+#line 50 "../defs/keywords" | |
{"while", {keyword_while, modifier_while}, EXPR_VALUE} | |
}; | |
@@ -214,6 +214,6 @@ rb_reserved_word (str, len) | |
} | |
return 0; | |
} | |
-#line 52 "defs/keywords" | |
+#line 52 "../defs/keywords" | |
#endif | |
diff --git a/parse.y b/parse.y | |
index 15fb491..cfdca97 100644 | |
--- a/parse.y | |
+++ b/parse.y | |
@@ -672,6 +672,7 @@ static void token_info_pop(struct parser_params*, const char *token); | |
modifier_while | |
modifier_until | |
modifier_rescue | |
+ modifier_case | |
keyword_alias | |
keyword_defined | |
keyword_BEGIN | |
@@ -699,7 +700,7 @@ static void token_info_pop(struct parser_params*, const char *token); | |
%type <node> mrhs superclass block_call block_command | |
%type <node> f_block_optarg f_block_opt | |
%type <node> f_arglist f_args f_arg f_arg_item f_optarg f_marg f_marg_list f_margs | |
-%type <node> assoc_list assocs assoc undef_list backref string_dvar for_var | |
+%type <node> assoc_list assocs assocsnl assoc undef_list backref string_dvar for_var | |
%type <node> block_param opt_block_param block_param_def f_opt | |
%type <node> bv_decls opt_bv_decl bvar | |
%type <node> lambda f_larglist lambda_body | |
@@ -748,12 +749,12 @@ static void token_info_pop(struct parser_params*, const char *token); | |
%nonassoc tLOWEST | |
%nonassoc tLBRACE_ARG | |
-%nonassoc modifier_if modifier_unless modifier_while modifier_until | |
+%nonassoc modifier_if modifier_unless modifier_while modifier_until modifier_case | |
%left keyword_or keyword_and | |
%right keyword_not | |
%nonassoc keyword_defined | |
%right '=' tOP_ASGN | |
-%left modifier_rescue | |
+%left modifier_rescue | |
%right '?' ':' | |
%nonassoc tDOT2 tDOT3 | |
%left tOROP | |
@@ -1045,6 +1046,22 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem | |
$$ = dispatch2(until_mod, $3, $1); | |
%*/ | |
} | |
+ | stmt modifier_case expr_value keyword_when args | |
+ { | |
+ /*%%%*/ | |
+ $$ = NEW_CASE($3, NEW_WHEN($5, $1, 0)); | |
+ /*% | |
+ $$ = dispatch2(case_mod, $3, $1); | |
+ %*/ | |
+ } | |
+ | stmt modifier_case keyword_when args | |
+ { | |
+ /*%%%*/ | |
+ $$ = NEW_CASE(0, NEW_WHEN($4, $1, 0)); | |
+ /*% | |
+ $$ = dispatch2(case_mod, 0, $1); | |
+ %*/ | |
+ } | |
| stmt modifier_rescue stmt | |
{ | |
/*%%%*/ | |
@@ -4687,7 +4704,7 @@ singleton : var_ref | |
; | |
assoc_list : none | |
- | assocs trailer | |
+ | assocsnl trailer | |
{ | |
/*%%%*/ | |
$$ = $1; | |
@@ -4713,6 +4730,22 @@ assocs : assoc | |
%*/ | |
} | |
; | |
+assocsnl : assoc | |
+ /*%c%*/ | |
+ /*%c | |
+ { | |
+ $$ = rb_ary_new3(1, $1); | |
+ } | |
+ %*/ | |
+ | assocsnl nlorcomma assoc | |
+ { | |
+ /*%%%*/ | |
+ $$ = list_concat($1, $3); | |
+ /*% | |
+ $$ = rb_ary_push($1, $3); | |
+ %*/ | |
+ } | |
+ ; | |
assoc : arg_value tASSOC arg_value | |
{ | |
@@ -4786,6 +4819,9 @@ term : ';' {yyerrok;} | |
terms : term | |
| terms ';' {yyerrok;} | |
; | |
+nlorcomma :'\n' | |
+ | ',' | |
+ ; | |
none : /* none */ | |
{ | |
@@ -10279,6 +10315,7 @@ static const struct kw_assoc { | |
{modifier_while, "while"}, | |
{modifier_until, "until"}, | |
{modifier_rescue, "rescue"}, | |
+ {modifier_case, "case"}, | |
{keyword_alias, "alias"}, | |
{keyword_defined, "defined?"}, | |
{keyword_BEGIN, "BEGIN"}, |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment