Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

# RubyLex cannot handle some edge-case code correctly #499

Closed
tompng opened this issue Jan 9, 2023 · 0 comments · Fixed by #500
Closed

# RubyLex cannot handle some edge-case code correctly #499

tompng opened this issue Jan 9, 2023 · 0 comments · Fixed by #500

Comments

@tompng
Copy link
Member

tompng commented Jan 9, 2023

Description

While reading ruby-lex.rb code, I found these bugs.

oneliner def

irb(main):001:1* if 0
irb(main):002:2*   def f()
irb(main):003:2*     = 1 # This is oneliner def
irb(main):004:1*     2 # but RubyLex thinks it's a normal method def
irb(main):005:1*     3

irb(main):001:3* if 1;if 1;if 1;
irb(main):002:2*       (a,b)=1 # RubyLex thinks (a,b)=1 is oneliner def
irb(main):003:1*       (a,*)=1 # See the prompt. nesting leven is 1
irb(main):004:0*       (a,)=1 # nesting level is 0
irb(main):005:-*       (*)=1 # nesting level is -1

keywords

irb(main):001:1* def a.if
irb(main):002:2*     1
irb(main):003:1> end

irb(main):001:1* def a.end
irb(main):002:0* 1

irb(main):001:2* def ((a;b())).do
irb(main):002:2*     1
irb(main):003:1> end
irb(main):004:0>

case in, pattern matching

irb(main):001:1* case 1
irb(main):002:1* when 1
irb(main):003:2*   def f
irb(main):004:2*   1 in 2
irb(main):005:1*   end
irb(main):006:0> end

irb(main):001:2* def self.case
irb(main):002:2*     1
irb(main):003:2* 1 in 2
irb(main):004:2*   2
irb(main):005:1> end

irb(main):001:1* if :case
irb(main):002:1* 1 in 2
irb(main):003:0> end

irb(main):001:1* def f
irb(main):002:1*   1 in 2
irb(main):003:1*     2 in 3

while do, until do, for do

irb(main):001:1* while
irb(main):002:2*   p do
irb(main):003:2*     1
irb(main):004:1>   end

irb(main):001:1* until
irb(main):002:2*   p do
irb(main):003:2*     1
irb(main):004:1>   end

irb(main):001:1* for i in
irb(main):002:2*   p do
irb(main):003:2*     1
irb(main):004:1>   end

irb(main):001:1* for
irb(main):002:2*   i in j do
irb(main):003:2*       1

irb(main):030:1* if 1
irb(main):031:1*   for i in (p do end)
irb(main):032:1* end

irb(main):001:1* if :for.tap do
irb(main):002:1*   1
irb(main):003:0* end
irb(main):004:-> end

irb(main):001:0* for i in -> do end do
irb(main):002:0* 1
irb(main):003:-> end

irb(main):001:1* for i in :\
irb(main):002:1:   do
irb(main):003:1:     1

heredoc

irb(main):001:0" <<~A
irb(main):002:2" #{((
irb(main):003:1"     )
irb(main):004:0"     )
irb(main):005:0"     }
irb(main):006:0>     A

unknown

irb(main):001:1* if 1
irb(main):002:1*   (case 1;when 2;end)
irb(main):003:1*     (case 1;when 2;end)
irb(main):004:0> end

irb(main):001:1* if 1
irb(main):002:0*   (p do end)
irb(main):003:->   end

irb(main):001:1* if 1
irb(main):002:1*   if (p do end)
irb(main):003:0* end

Result of irb_info

Ruby version: 3.2.0                                                                  
IRB version: irb 1.6.2 (2022-12-13)                                                  
InputMethod: RelineInputMethod with Reline 0.3.2                                     
.irbrc path: /Users/tomoya/.irbrc                                                    
RUBY_PLATFORM: x86_64-darwin20                                                       
LANG env: ja_JP.UTF-8                                                                
East Asian Ambiguous Width: 1      

Terminal Emulator

macOS Terminal.app

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging a pull request may close this issue.

1 participant