@@ -396,7 +396,9 @@ def token
396396 "r" => "/" ,
397397 "w" => "]" ,
398398 "W" => "]" ,
399- "s" => ":"
399+ "s" => ":" ,
400+ "i" => "]" ,
401+ "I" => "]"
400402 }
401403
402404 PERCENT_PAREN = {
@@ -479,25 +481,50 @@ def lex_init()
479481 Token ( TkNL )
480482 end
481483
484+ @OP . def_rules ( "=" ) do
485+ |op , io |
486+ case @lex_state
487+ when :EXPR_FNAME , :EXPR_DOT
488+ @lex_state = :EXPR_ARG
489+ else
490+ @lex_state = :EXPR_BEG
491+ end
492+ Token ( op )
493+ end
494+
482495 @OP . def_rules ( "*" , "**" ,
483- "=" , "= =", "===" ,
496+ "==" , "===" ,
484497 "=~" , "<=>" ,
485498 "<" , "<=" ,
486499 ">" , ">=" , ">>" , "=>" ) do
487500 |op , io |
488501 case @lex_state
489502 when :EXPR_FNAME , :EXPR_DOT
503+ tk = Token ( TkId , op )
490504 @lex_state = :EXPR_ARG
491505 else
506+ tk = Token ( op )
492507 @lex_state = :EXPR_BEG
493508 end
509+ tk
510+ end
511+
512+ @OP . def_rules ( "->" ) do
513+ |op , io |
514+ @lex_state = :EXPR_ENDFN
494515 Token ( op )
495516 end
496517
497518 @OP . def_rules ( "!" , "!=" , "!~" ) do
498519 |op , io |
499- @lex_state = :EXPR_BEG
500- Token ( op )
520+ case @lex_state
521+ when :EXPR_FNAME , :EXPR_DOT
522+ @lex_state = :EXPR_ARG
523+ Token ( TkId , op )
524+ else
525+ @lex_state = :EXPR_BEG
526+ Token ( op )
527+ end
501528 end
502529
503530 @OP . def_rules ( "<<" ) do
@@ -511,11 +538,12 @@ def lex_init()
511538 end
512539 end
513540 unless tk
514- tk = Token ( op )
515541 case @lex_state
516542 when :EXPR_FNAME , :EXPR_DOT
543+ tk = Token ( TkId , op )
517544 @lex_state = :EXPR_ARG
518545 else
546+ tk = Token ( op )
519547 @lex_state = :EXPR_BEG
520548 end
521549 end
@@ -529,9 +557,9 @@ def lex_init()
529557
530558 @OP . def_rules ( "`" ) do
531559 |op , io |
532- if @lex_state == :EXPR_FNAME
533- @lex_state = :EXPR_END
534- Token ( op )
560+ if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
561+ @lex_state = :EXPR_ARG
562+ Token ( TkId , op )
535563 else
536564 identify_string ( op )
537565 end
@@ -555,12 +583,25 @@ def lex_init()
555583 end
556584 end
557585
558- @OP . def_rules ( "&" , "&&" , "| ", "||" ) do
586+ @OP . def_rules ( "&& " , "||" ) do
559587 |op , io |
560588 @lex_state = :EXPR_BEG
561589 Token ( op )
562590 end
563591
592+ @OP . def_rules ( "&" , "|" ) do
593+ |op , io |
594+ case @lex_state
595+ when :EXPR_FNAME , :EXPR_DOT
596+ tk = Token ( TkId , op )
597+ @lex_state = :EXPR_ARG
598+ else
599+ tk = Token ( op )
600+ @lex_state = :EXPR_BEG
601+ end
602+ tk
603+ end
604+
564605 @OP . def_rules ( "+=" , "-=" , "*=" , "**=" ,
565606 "&=" , "|=" , "^=" , "<<=" , ">>=" , "||=" , "&&=" ) do
566607 |op , io |
@@ -572,19 +613,22 @@ def lex_init()
572613 @OP . def_rule ( "+@" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
573614 |op , io |
574615 @lex_state = :EXPR_ARG
575- Token ( op )
616+ Token ( TkId , op )
576617 end
577618
578619 @OP . def_rule ( "-@" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
579620 |op , io |
580621 @lex_state = :EXPR_ARG
581- Token ( op )
622+ Token ( TkId , op )
582623 end
583624
584625 @OP . def_rules ( "+" , "-" ) do
585626 |op , io |
586627 catch ( :RET ) do
587- if @lex_state == :EXPR_ARG
628+ if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
629+ tk = Token ( TkId , op )
630+ @lex_state = :EXPR_ARG
631+ elsif @lex_state == :EXPR_ARG
588632 if @space_seen and peek ( 0 ) =~ /[0-9]/
589633 throw :RET , identify_number ( op )
590634 else
@@ -595,7 +639,8 @@ def lex_init()
595639 else
596640 @lex_state = :EXPR_BEG
597641 end
598- Token ( op )
642+ tk = Token ( op ) unless tk
643+ tk
599644 end
600645 end
601646
@@ -655,7 +700,10 @@ def lex_int2
655700
656701 @OP . def_rule ( "/" ) do
657702 |op , io |
658- if @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
703+ if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
704+ @lex_state = :EXPR_ARG
705+ Token ( TkId , op )
706+ elsif @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
659707 identify_string ( op )
660708 elsif peek ( 0 ) == '='
661709 getc
@@ -671,8 +719,15 @@ def lex_int2
671719
672720 @OP . def_rules ( "^" ) do
673721 |op , io |
674- @lex_state = :EXPR_BEG
675- Token ( "^" )
722+ case @lex_state
723+ when :EXPR_FNAME , :EXPR_DOT
724+ tk = Token ( TkId , op )
725+ @lex_state = :EXPR_ARG
726+ else
727+ tk = Token ( op )
728+ @lex_state = :EXPR_BEG
729+ end
730+ tk
676731 end
677732
678733 # @OP.def_rules("^=") do
@@ -699,8 +754,14 @@ def lex_int2
699754
700755 @OP . def_rule ( "~" ) do
701756 |op , io |
702- @lex_state = :EXPR_BEG
703- Token ( "~" )
757+ case @lex_state
758+ when :EXPR_FNAME , :EXPR_DOT
759+ @lex_state = :EXPR_ARG
760+ Token ( TkId , op )
761+ else
762+ @lex_state = :EXPR_BEG
763+ Token ( op )
764+ end
704765 end
705766
706767 @OP . def_rule ( "~@" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
@@ -726,17 +787,18 @@ def lex_int2
726787 @OP . def_rule ( "[]" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
727788 |op , io |
728789 @lex_state = :EXPR_ARG
729- Token ( "[]" )
790+ Token ( TkId , op )
730791 end
731792
732793 @OP . def_rule ( "[]=" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
733794 |op , io |
734795 @lex_state = :EXPR_ARG
735- Token ( "[]=" )
796+ Token ( TkId , op )
736797 end
737798
738799 @OP . def_rule ( "[" ) do
739800 |op , io |
801+ text = nil
740802 @indent += 1
741803 if @lex_state == :EXPR_FNAME
742804 tk_c = TkfLBRACK
@@ -745,13 +807,25 @@ def lex_int2
745807 tk_c = TkLBRACK
746808 elsif @lex_state == :EXPR_ARG && @space_seen
747809 tk_c = TkLBRACK
810+ elsif @lex_state == :EXPR_DOT
811+ if peek ( 0 ) == "]"
812+ tk_c = TkIDENTIFIER
813+ getc
814+ if peek ( 0 ) == "="
815+ text = "[]="
816+ else
817+ text = "[]"
818+ end
819+ else
820+ tk_c = TkOp
821+ end
748822 else
749823 tk_c = TkfLBRACK
750824 end
751825 @lex_state = :EXPR_BEG
752826 end
753827 @indent_stack . push tk_c
754- Token ( tk_c )
828+ Token ( tk_c , text )
755829 end
756830
757831 @OP . def_rule ( "{" ) do
@@ -769,19 +843,19 @@ def lex_int2
769843
770844 @OP . def_rule ( '\\' ) do
771845 |op , io |
772- if getc == "\n "
846+ if peek ( 0 ) == "\n "
773847 @space_seen = true
774848 @continue = true
775- Token ( TkSPACE )
776- else
777- ungetc
778- Token ( "\\ " )
779849 end
850+ Token ( "\\ " )
780851 end
781852
782853 @OP . def_rule ( '%' ) do
783854 |op , io |
784- if @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
855+ if :EXPR_FNAME == @lex_state or :EXPR_DOT == @lex_state
856+ @lex_state = :EXPR_ARG
857+ Token ( TkId , op )
858+ elsif @lex_state == :EXPR_BEG || @lex_state == :EXPR_MID
785859 identify_quotation
786860 elsif peek ( 0 ) == '='
787861 getc
@@ -948,7 +1022,12 @@ def identify_identifier
9481022 @indent_stack . push token_c
9491023 end
9501024 else
951- token_c = TkIDENTIFIER
1025+ if peek ( 0 ) == ':' and !peek_match? ( /^::/ )
1026+ token . concat getc
1027+ token_c = TkSYMBOL
1028+ else
1029+ token_c = TkIDENTIFIER
1030+ end
9521031 end
9531032
9541033 elsif DEINDENT_CLAUSE . include? ( token )
@@ -977,11 +1056,20 @@ def identify_identifier
9771056 end
9781057
9791058 if token [ 0 , 1 ] =~ /[A-Z]/
980- return Token ( TkCONSTANT , token )
1059+ if token [ -1 ] =~ /[!?]/
1060+ return Token ( TkIDENTIFIER , token )
1061+ else
1062+ return Token ( TkCONSTANT , token )
1063+ end
9811064 elsif token [ token . size - 1 , 1 ] =~ /[!?]/
9821065 return Token ( TkFID , token )
9831066 else
984- return Token ( TkIDENTIFIER , token )
1067+ if peek ( 0 ) == ':' and !peek_match? ( /^::/ )
1068+ token . concat getc
1069+ return Token ( TkSYMBOL , token )
1070+ else
1071+ return Token ( TkIDENTIFIER , token )
1072+ end
9851073 end
9861074 end
9871075
@@ -1211,7 +1299,7 @@ def identify_string(ltype, quoted = ltype, type = nil)
12111299 str = if ltype == quoted and %w[ " ' / ] . include? ltype then
12121300 ltype . dup
12131301 else
1214- "%#{ type or PERCENT_LTYPE . key ltype } #{ PERCENT_PAREN_REV [ quoted ] ||quoted } "
1302+ "%#{ type } #{ PERCENT_PAREN_REV [ quoted ] ||quoted } "
12151303 end
12161304
12171305 subtype = nil
@@ -1225,8 +1313,8 @@ def identify_string(ltype, quoted = ltype, type = nil)
12251313 break
12261314 elsif @ltype != "'" && @ltype != "]" && @ltype != ":" and ch == "#"
12271315 ch = getc
1228- subtype = true
12291316 if ch == "{" then
1317+ subtype = true
12301318 str << ch << skip_inner_expression
12311319 next
12321320 else
@@ -1235,7 +1323,7 @@ def identify_string(ltype, quoted = ltype, type = nil)
12351323 elsif ch == '\\'
12361324 if %w[ ' / ] . include? @ltype then
12371325 case ch = getc
1238- when "\\ " , " \ n ", "'"
1326+ when "\n " , "'"
12391327 when @ltype
12401328 str << ch
12411329 else
0 commit comments