Skip to content

Instantly share code, notes, and snippets.

@zonuexe
Created June 13, 2023 09:03
Show Gist options
  • Save zonuexe/43c374155ba6bb7f2b1ec507340d9c2e to your computer and use it in GitHub Desktop.
Save zonuexe/43c374155ba6bb7f2b1ec507340d9c2e to your computer and use it in GitHub Desktop.
Ruby 1.9で,なしの改行区切りする parse.y パッチ
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