https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2021-08-18T00:38:37Z
Ruby Issue Tracking System
Ruby master - Bug #18080: Syntax error on one-line pattern matching
https://bugs.ruby-lang.org/issues/18080?journal_id=93321
2021-08-18T00:38:37Z
ko1 (Koichi Sasada)
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/93321/diff?detail_id=60598">diff</a>)</li></ul>
Ruby master - Bug #18080: Syntax error on one-line pattern matching
https://bugs.ruby-lang.org/issues/18080?journal_id=104348
2023-08-25T16:52:02Z
jeremyevans0 (Jeremy Evans)
merch-redmine@jeremyevans.net
<ul></ul><p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/10206">@kddnewton (Kevin Newton)</a> Is this possible to support in YARP?</p>
<p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/7872">@yui-knk (Kaneko Yuichiro)</a> Is this possible to support in parse.y/lrama?</p>
Ruby master - Bug #18080: Syntax error on one-line pattern matching
https://bugs.ruby-lang.org/issues/18080?journal_id=104355
2023-08-25T17:23:05Z
mdalessio (Mike Dalessio)
mike.dalessio@gmail.com
<ul></ul><p>Looks like YARP already supports this.</p>
<pre><code>"> YARP.parse <<~EOF
"> p 1 do
"> end in a
"> p 1 do
"> end => a
>> EOF
=>
#<YARP::ParseResult:0x00007f0f326c5280
@comments=[],
@errors=[],
@source=#<YARP::Source:0x00007f0f328c35a0 @offsets=[0, 7, 16, 23, 32], @source="p 1 do\nend in a\np 1 do\nend => a\n">,
@value=
ProgramNode(0...31)(
[:a],
StatementsNode(0...31)(
[MatchPredicateNode(0...15)(
CallNode(0...10)(
nil,
nil,
(0...1),
nil,
ArgumentsNode(2...3)([IntegerNode(2...3)()]),
nil,
BlockNode(4...10)([], nil, nil, (4...6), (7...10)),
0,
"p"
),
LocalVariableWriteNode(14...15)(:a, 0, nil, (14...15), nil),
(11...13)
),
MatchRequiredNode(16...31)(
CallNode(16...26)(
nil,
nil,
(16...17),
nil,
ArgumentsNode(18...19)([IntegerNode(18...19)()]),
nil,
BlockNode(20...26)([], nil, nil, (20...22), (23...26)),
0,
"p"
),
LocalVariableWriteNode(30...31)(:a, 0, nil, (30...31), nil),
(27...29)
)]
)
),
@warnings=[]>
</code></pre>
Ruby master - Bug #18080: Syntax error on one-line pattern matching
https://bugs.ruby-lang.org/issues/18080?journal_id=104369
2023-08-25T18:13:53Z
kddnewton (Kevin Newton)
kddnewton@gmail.com
<ul></ul><p>As Mike said, there's no issue with this for YARP.</p>
Ruby master - Bug #18080: Syntax error on one-line pattern matching
https://bugs.ruby-lang.org/issues/18080?journal_id=104454
2023-09-04T23:01:09Z
yui-knk (Kaneko Yuichiro)
<ul></ul><p>It's possible <a href="https://github.com/yui-knk/ruby/tree/bugs_18080" class="external">https://github.com/yui-knk/ruby/tree/bugs_18080</a>.</p>
<p>However need to notice about inconsistency for one line pattern matching for command call without block, like <code>[].append 1 => a</code>. Because this is interpreted as <code>#append</code> call with hash (<code>1 => a</code>) now, so it's impossible to change the behavior without introducing incompatibility.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[].</span><span class="nf">append</span> <span class="o">=></span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span> <span class="k">in</span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span> <span class="k">do</span>
<span class="k">end</span> <span class="o">=></span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span> <span class="k">do</span>
<span class="k">end</span> <span class="k">in</span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">=></span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">in</span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span>
<span class="k">end</span> <span class="o">=></span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span>
<span class="k">end</span> <span class="k">in</span> <span class="n">a</span>
<span class="c1"># Only this is interpreted as #append method call with hash argument</span>
<span class="p">[].</span><span class="nf">append</span> <span class="mi">1</span> <span class="o">=></span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span> <span class="mi">1</span> <span class="k">in</span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span> <span class="mi">1</span> <span class="k">do</span>
<span class="k">end</span> <span class="o">=></span> <span class="n">a</span>
<span class="p">[].</span><span class="nf">append</span> <span class="mi">1</span> <span class="k">do</span>
<span class="k">end</span> <span class="k">in</span> <span class="n">a</span>
</code></pre>
<p>In my opinion (1) is more clear than (2).</p>
<p>(1) Method call without surrounding parameters parenthesis can not be put on left of single line pattern matching</p>
<p>(2) Almost all method calls can be on left of single line pattern matching but there is one exception (a) without block (b) without parenthesis for parameters (c) pattern matching with <code>=></code></p>
<a name="Note"></a>
<h1 >Note<a href="#Note" class="wiki-anchor">¶</a></h1>
<p>The inconsistency can be found as Shift/Reduce conflict. In this state, shift derives <code>arg_value • "=>" arg_value</code> (hash), on the other hand reduce derives <code>command_call => p_top_expr_body</code> (pattern matching).</p>
<p><a href="https://github.com/yui-knk/ruby/tree/bugs_18080_2" class="external">https://github.com/yui-knk/ruby/tree/bugs_18080_2</a></p>
<pre><code>State 223
shift/reduce conflict on token "=>":
308 args: arg_value •
759 assoc: arg_value • "=>" arg_value
First example: $@1 k_return arg_value • "=>" arg_value opt_block_arg "=>" @7 @8 p_top_expr_body opt_terms "end-of-input"
Shift derivation
$accept
↳ 0: program "end-of-input"
↳ 2: $@1 top_compstmt
↳ 3: top_stmts opt_terms
↳ 5: top_stmt
↳ 7: stmt
↳ 37: expr
↳ 65: command "=>" @7 @8 p_top_expr_body
↳ 97: k_return call_args
↳ 299: assocs opt_block_arg
↳ 757: assoc
↳ 759: arg_value • "=>" arg_value
Second example: $@1 k_return arg_value • opt_block_arg "=>" @7 @8 p_top_expr_body opt_terms "end-of-input"
Reduce derivation
$accept
↳ 0: program "end-of-input"
↳ 2: $@1 top_compstmt
↳ 3: top_stmts opt_terms
↳ 5: top_stmt
↳ 7: stmt
↳ 37: expr
↳ 65: command_call "=>" @7 @8 p_top_expr_body
↳ 82: command
↳ 97: k_return call_args
↳ 298: args opt_block_arg
↳ 308: arg_value •
</code></pre>