Project

General

Profile

Actions

Feature #14808

closed

Last token of endless range should have EXPR_END

Added by aycabta (aycabta .) almost 6 years ago. Updated almost 6 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
[ruby-core:87352]

Description

In 2.5.1:

irb(main):001:0> require 'ripper'
irb(main):002:0> pp Ripper.lex("case 5\nwhen 3..\n  puts(true)\nend\n")
[[[1, 0], :on_kw, "case", EXPR_BEG],
 [[1, 4], :on_sp, " ", EXPR_BEG],
 [[1, 5], :on_int, "5", EXPR_END|EXPR_ENDARG],
 [[1, 6], :on_nl, "\n", EXPR_BEG],
 [[2, 0], :on_kw, "when", EXPR_BEG],
 [[2, 4], :on_sp, " ", EXPR_BEG],
 [[2, 5], :on_int, "3", EXPR_END|EXPR_ENDARG],
 [[2, 6], :on_op, "..", EXPR_BEG],
 [[2, 8], :on_ignored_nl, "\n", EXPR_BEG],
 [[3, 0], :on_sp, "  ", EXPR_BEG],
 [[3, 2], :on_ident, "puts", EXPR_ARG],
 [[3, 6], :on_lparen, "(", EXPR_BEG|EXPR_LABEL],
 [[3, 7], :on_kw, "true", EXPR_END],
 [[3, 11], :on_rparen, ")", EXPR_ENDFN],
 [[3, 12], :on_nl, "\n", EXPR_BEG],
 [[4, 0], :on_kw, "end", EXPR_END],
 [[4, 3], :on_nl, "\n", EXPR_BEG]]

This is invalid code in 2.5.1, so I understand this result.

In 63451:

irb(main):001:0> require 'ripper'
irb(main):002:0> pp Ripper.lex("case 5\nwhen 3..\n  puts(true)\nend\n")
[[[1, 0], :on_kw, "case", EXPR_BEG],
 [[1, 4], :on_sp, " ", EXPR_BEG],
 [[1, 5], :on_int, "5", EXPR_END],
 [[1, 6], :on_nl, "\n", EXPR_BEG],
 [[2, 0], :on_kw, "when", EXPR_BEG],
 [[2, 4], :on_sp, " ", EXPR_BEG],
 [[2, 5], :on_int, "3", EXPR_END],
 [[2, 6], :on_op, "..", EXPR_BEG],
 [[2, 8], :on_ignored_nl, "\n", EXPR_BEG],
 [[3, 0], :on_sp, "  ", EXPR_BEG],
 [[3, 2], :on_ident, "puts", EXPR_ARG],
 [[3, 6], :on_lparen, "(", EXPR_BEG|EXPR_LABEL],
 [[3, 7], :on_kw, "true", EXPR_END],
 [[3, 11], :on_rparen, ")", EXPR_ENDFN],
 [[3, 12], :on_nl, "\n", EXPR_BEG],
 [[4, 0], :on_kw, "end", EXPR_END],
 [[4, 3], :on_nl, "\n", EXPR_BEG]]

This is correct code in this revision.

I think that lex_state of the last token of endless range, [[2, 6], :on_op, "..", EXPR_BEG], it should be EXPR_END. Because it's the end of an argument. It's important for REPL, RDoc, and so on.

But lex_state is parser matter in parse.y. How about this for the parser of Ruby compiler?


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #14824: Endless Range Support in irbClosedaycabta (aycabta .)Actions

Updated by nobu (Nobuyoshi Nakada) almost 6 years ago

  • Status changed from Open to Rejected

That code is valid syntax in both versions, and it is not an endless range in the trunk as well as 2.5.
As .. is an infix operator and requires the RHS, newlines following it are just ignored.
So it equals to:

case 5
when (3..puts(true))
end

It results in an error at runtime in 2.5, not a syntax error.

$ ruby2.5 -rripper -e 'case 5' -e 'when 3..' -e  'puts(true)' -e end
true
Traceback (most recent call last):
-e:3:in `<main>': bad value for range (ArgumentError)

To put an endless range there, use parentheses.

Actions #2

Updated by aycabta (aycabta .) almost 6 years ago

  • Related to Bug #14824: Endless Range Support in irb added
Actions

Also available in: Atom PDF

Like0
Like0Like0