Skip to content

Commit e45f7cd

Browse files
committed
Handle redefinable operators as identifier
1 parent 20af2f6 commit e45f7cd

File tree

1 file changed

+77
-21
lines changed

1 file changed

+77
-21
lines changed

lib/rdoc/ruby_lex.rb

Lines changed: 77 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -479,25 +479,44 @@ def lex_init()
479479
Token(TkNL)
480480
end
481481

482+
@OP.def_rules("=") do
483+
|op, io|
484+
case @lex_state
485+
when :EXPR_FNAME, :EXPR_DOT
486+
@lex_state = :EXPR_ARG
487+
else
488+
@lex_state = :EXPR_BEG
489+
end
490+
Token(op)
491+
end
492+
482493
@OP.def_rules("*", "**",
483-
"=", "==", "===",
494+
"==", "===",
484495
"=~", "<=>",
485496
"<", "<=",
486497
">", ">=", ">>") do
487498
|op, io|
488499
case @lex_state
489500
when :EXPR_FNAME, :EXPR_DOT
501+
tk = Token(TkId, op)
490502
@lex_state = :EXPR_ARG
491503
else
504+
tk = Token(op)
492505
@lex_state = :EXPR_BEG
493506
end
494-
Token(op)
507+
tk
495508
end
496509

497510
@OP.def_rules("!", "!=", "!~") do
498511
|op, io|
499-
@lex_state = :EXPR_BEG
500-
Token(op)
512+
case @lex_state
513+
when :EXPR_FNAME, :EXPR_DOT
514+
@lex_state = :EXPR_ARG
515+
Token(TkId, op)
516+
else
517+
@lex_state = :EXPR_BEG
518+
Token(op)
519+
end
501520
end
502521

503522
@OP.def_rules("<<") do
@@ -511,11 +530,12 @@ def lex_init()
511530
end
512531
end
513532
unless tk
514-
tk = Token(op)
515533
case @lex_state
516534
when :EXPR_FNAME, :EXPR_DOT
535+
tk = Token(TkId, op)
517536
@lex_state = :EXPR_ARG
518537
else
538+
tk = Token(op)
519539
@lex_state = :EXPR_BEG
520540
end
521541
end
@@ -529,9 +549,9 @@ def lex_init()
529549

530550
@OP.def_rules("`") do
531551
|op, io|
532-
if @lex_state == :EXPR_FNAME
533-
@lex_state = :EXPR_END
534-
Token(op)
552+
if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
553+
@lex_state = :EXPR_ARG
554+
Token(TkId, op)
535555
else
536556
identify_string(op)
537557
end
@@ -555,12 +575,25 @@ def lex_init()
555575
end
556576
end
557577

558-
@OP.def_rules("&", "&&", "|", "||") do
578+
@OP.def_rules("&&", "||") do
559579
|op, io|
560580
@lex_state = :EXPR_BEG
561581
Token(op)
562582
end
563583

584+
@OP.def_rules("&", "|") do
585+
|op, io|
586+
case @lex_state
587+
when :EXPR_FNAME, :EXPR_DOT
588+
tk = Token(TkId, op)
589+
@lex_state = :EXPR_ARG
590+
else
591+
tk = Token(op)
592+
@lex_state = :EXPR_BEG
593+
end
594+
tk
595+
end
596+
564597
@OP.def_rules("+=", "-=", "*=", "**=",
565598
"&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do
566599
|op, io|
@@ -572,19 +605,22 @@ def lex_init()
572605
@OP.def_rule("+@", proc{|op, io| @lex_state == :EXPR_FNAME}) do
573606
|op, io|
574607
@lex_state = :EXPR_ARG
575-
Token(op)
608+
Token(TkId, op)
576609
end
577610

578611
@OP.def_rule("-@", proc{|op, io| @lex_state == :EXPR_FNAME}) do
579612
|op, io|
580613
@lex_state = :EXPR_ARG
581-
Token(op)
614+
Token(TkId, op)
582615
end
583616

584617
@OP.def_rules("+", "-") do
585618
|op, io|
586619
catch(:RET) do
587-
if @lex_state == :EXPR_ARG
620+
if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
621+
tk = Token(TkId, op)
622+
@lex_state = :EXPR_ARG
623+
elsif @lex_state == :EXPR_ARG
588624
if @space_seen and peek(0) =~ /[0-9]/
589625
throw :RET, identify_number(op)
590626
else
@@ -595,7 +631,8 @@ def lex_init()
595631
else
596632
@lex_state = :EXPR_BEG
597633
end
598-
Token(op)
634+
tk = Token(op) unless tk
635+
tk
599636
end
600637
end
601638

@@ -655,7 +692,10 @@ def lex_int2
655692

656693
@OP.def_rule("/") do
657694
|op, io|
658-
if @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
695+
if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
696+
@lex_state = :EXPR_ARG
697+
Token(TkId, op)
698+
elsif @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
659699
identify_string(op)
660700
elsif peek(0) == '='
661701
getc
@@ -671,8 +711,15 @@ def lex_int2
671711

672712
@OP.def_rules("^") do
673713
|op, io|
674-
@lex_state = :EXPR_BEG
675-
Token("^")
714+
case @lex_state
715+
when :EXPR_FNAME, :EXPR_DOT
716+
tk = Token(TkId, op)
717+
@lex_state = :EXPR_ARG
718+
else
719+
tk = Token(op)
720+
@lex_state = :EXPR_BEG
721+
end
722+
tk
676723
end
677724

678725
# @OP.def_rules("^=") do
@@ -699,8 +746,14 @@ def lex_int2
699746

700747
@OP.def_rule("~") do
701748
|op, io|
702-
@lex_state = :EXPR_BEG
703-
Token("~")
749+
case @lex_state
750+
when :EXPR_FNAME, :EXPR_DOT
751+
@lex_state = :EXPR_ARG
752+
Token(TkId, op)
753+
else
754+
@lex_state = :EXPR_BEG
755+
Token(op)
756+
end
704757
end
705758

706759
@OP.def_rule("~@", proc{|op, io| @lex_state == :EXPR_FNAME}) do
@@ -726,13 +779,13 @@ def lex_int2
726779
@OP.def_rule("[]", proc{|op, io| @lex_state == :EXPR_FNAME}) do
727780
|op, io|
728781
@lex_state = :EXPR_ARG
729-
Token("[]")
782+
Token(TkId, op)
730783
end
731784

732785
@OP.def_rule("[]=", proc{|op, io| @lex_state == :EXPR_FNAME}) do
733786
|op, io|
734787
@lex_state = :EXPR_ARG
735-
Token("[]=")
788+
Token(TkId, op)
736789
end
737790

738791
@OP.def_rule("[") do
@@ -781,7 +834,10 @@ def lex_int2
781834

782835
@OP.def_rule('%') do
783836
|op, io|
784-
if @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
837+
if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
838+
@lex_state = :EXPR_ARG
839+
Token(TkId, op)
840+
elsif @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
785841
identify_quotation
786842
elsif peek(0) == '='
787843
getc

0 commit comments

Comments
 (0)