@@ -396,7 +396,9 @@ def token
396
396
"r" => "/" ,
397
397
"w" => "]" ,
398
398
"W" => "]" ,
399
- "s" => ":"
399
+ "s" => ":" ,
400
+ "i" => "]" ,
401
+ "I" => "]"
400
402
}
401
403
402
404
PERCENT_PAREN = {
@@ -479,25 +481,50 @@ def lex_init()
479
481
Token ( TkNL )
480
482
end
481
483
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
+
482
495
@OP . def_rules ( "*" , "**" ,
483
- "=" , "= =", "===" ,
496
+ "==" , "===" ,
484
497
"=~" , "<=>" ,
485
498
"<" , "<=" ,
486
499
">" , ">=" , ">>" , "=>" ) do
487
500
|op , io |
488
501
case @lex_state
489
502
when :EXPR_FNAME , :EXPR_DOT
503
+ tk = Token ( TkId , op )
490
504
@lex_state = :EXPR_ARG
491
505
else
506
+ tk = Token ( op )
492
507
@lex_state = :EXPR_BEG
493
508
end
509
+ tk
510
+ end
511
+
512
+ @OP . def_rules ( "->" ) do
513
+ |op , io |
514
+ @lex_state = :EXPR_ENDFN
494
515
Token ( op )
495
516
end
496
517
497
518
@OP . def_rules ( "!" , "!=" , "!~" ) do
498
519
|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
501
528
end
502
529
503
530
@OP . def_rules ( "<<" ) do
@@ -511,11 +538,12 @@ def lex_init()
511
538
end
512
539
end
513
540
unless tk
514
- tk = Token ( op )
515
541
case @lex_state
516
542
when :EXPR_FNAME , :EXPR_DOT
543
+ tk = Token ( TkId , op )
517
544
@lex_state = :EXPR_ARG
518
545
else
546
+ tk = Token ( op )
519
547
@lex_state = :EXPR_BEG
520
548
end
521
549
end
@@ -529,9 +557,9 @@ def lex_init()
529
557
530
558
@OP . def_rules ( "`" ) do
531
559
|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 )
535
563
else
536
564
identify_string ( op )
537
565
end
@@ -555,12 +583,25 @@ def lex_init()
555
583
end
556
584
end
557
585
558
- @OP . def_rules ( "&" , "&&" , "| ", "||" ) do
586
+ @OP . def_rules ( "&& " , "||" ) do
559
587
|op , io |
560
588
@lex_state = :EXPR_BEG
561
589
Token ( op )
562
590
end
563
591
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
+
564
605
@OP . def_rules ( "+=" , "-=" , "*=" , "**=" ,
565
606
"&=" , "|=" , "^=" , "<<=" , ">>=" , "||=" , "&&=" ) do
566
607
|op , io |
@@ -572,19 +613,22 @@ def lex_init()
572
613
@OP . def_rule ( "+@" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
573
614
|op , io |
574
615
@lex_state = :EXPR_ARG
575
- Token ( op )
616
+ Token ( TkId , op )
576
617
end
577
618
578
619
@OP . def_rule ( "-@" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
579
620
|op , io |
580
621
@lex_state = :EXPR_ARG
581
- Token ( op )
622
+ Token ( TkId , op )
582
623
end
583
624
584
625
@OP . def_rules ( "+" , "-" ) do
585
626
|op , io |
586
627
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
588
632
if @space_seen and peek ( 0 ) =~ /[0-9]/
589
633
throw :RET , identify_number ( op )
590
634
else
@@ -595,7 +639,8 @@ def lex_init()
595
639
else
596
640
@lex_state = :EXPR_BEG
597
641
end
598
- Token ( op )
642
+ tk = Token ( op ) unless tk
643
+ tk
599
644
end
600
645
end
601
646
@@ -655,7 +700,10 @@ def lex_int2
655
700
656
701
@OP . def_rule ( "/" ) do
657
702
|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
659
707
identify_string ( op )
660
708
elsif peek ( 0 ) == '='
661
709
getc
@@ -671,8 +719,15 @@ def lex_int2
671
719
672
720
@OP . def_rules ( "^" ) do
673
721
|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
676
731
end
677
732
678
733
# @OP.def_rules("^=") do
@@ -699,8 +754,14 @@ def lex_int2
699
754
700
755
@OP . def_rule ( "~" ) do
701
756
|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
704
765
end
705
766
706
767
@OP . def_rule ( "~@" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
@@ -726,17 +787,18 @@ def lex_int2
726
787
@OP . def_rule ( "[]" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
727
788
|op , io |
728
789
@lex_state = :EXPR_ARG
729
- Token ( "[]" )
790
+ Token ( TkId , op )
730
791
end
731
792
732
793
@OP . def_rule ( "[]=" , proc { |op , io | @lex_state == :EXPR_FNAME } ) do
733
794
|op , io |
734
795
@lex_state = :EXPR_ARG
735
- Token ( "[]=" )
796
+ Token ( TkId , op )
736
797
end
737
798
738
799
@OP . def_rule ( "[" ) do
739
800
|op , io |
801
+ text = nil
740
802
@indent += 1
741
803
if @lex_state == :EXPR_FNAME
742
804
tk_c = TkfLBRACK
@@ -745,13 +807,25 @@ def lex_int2
745
807
tk_c = TkLBRACK
746
808
elsif @lex_state == :EXPR_ARG && @space_seen
747
809
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
748
822
else
749
823
tk_c = TkfLBRACK
750
824
end
751
825
@lex_state = :EXPR_BEG
752
826
end
753
827
@indent_stack . push tk_c
754
- Token ( tk_c )
828
+ Token ( tk_c , text )
755
829
end
756
830
757
831
@OP . def_rule ( "{" ) do
@@ -769,19 +843,19 @@ def lex_int2
769
843
770
844
@OP . def_rule ( '\\' ) do
771
845
|op , io |
772
- if getc == "\n "
846
+ if peek ( 0 ) == "\n "
773
847
@space_seen = true
774
848
@continue = true
775
- Token ( TkSPACE )
776
- else
777
- ungetc
778
- Token ( "\\ " )
779
849
end
850
+ Token ( "\\ " )
780
851
end
781
852
782
853
@OP . def_rule ( '%' ) do
783
854
|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
785
859
identify_quotation
786
860
elsif peek ( 0 ) == '='
787
861
getc
@@ -948,7 +1022,12 @@ def identify_identifier
948
1022
@indent_stack . push token_c
949
1023
end
950
1024
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
952
1031
end
953
1032
954
1033
elsif DEINDENT_CLAUSE . include? ( token )
@@ -977,11 +1056,20 @@ def identify_identifier
977
1056
end
978
1057
979
1058
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
981
1064
elsif token [ token . size - 1 , 1 ] =~ /[!?]/
982
1065
return Token ( TkFID , token )
983
1066
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
985
1073
end
986
1074
end
987
1075
@@ -1211,7 +1299,7 @@ def identify_string(ltype, quoted = ltype, type = nil)
1211
1299
str = if ltype == quoted and %w[ " ' / ] . include? ltype then
1212
1300
ltype . dup
1213
1301
else
1214
- "%#{ type or PERCENT_LTYPE . key ltype } #{ PERCENT_PAREN_REV [ quoted ] ||quoted } "
1302
+ "%#{ type } #{ PERCENT_PAREN_REV [ quoted ] ||quoted } "
1215
1303
end
1216
1304
1217
1305
subtype = nil
@@ -1225,8 +1313,8 @@ def identify_string(ltype, quoted = ltype, type = nil)
1225
1313
break
1226
1314
elsif @ltype != "'" && @ltype != "]" && @ltype != ":" and ch == "#"
1227
1315
ch = getc
1228
- subtype = true
1229
1316
if ch == "{" then
1317
+ subtype = true
1230
1318
str << ch << skip_inner_expression
1231
1319
next
1232
1320
else
@@ -1235,7 +1323,7 @@ def identify_string(ltype, quoted = ltype, type = nil)
1235
1323
elsif ch == '\\'
1236
1324
if %w[ ' / ] . include? @ltype then
1237
1325
case ch = getc
1238
- when "\\ " , " \ n ", "'"
1326
+ when "\n " , "'"
1239
1327
when @ltype
1240
1328
str << ch
1241
1329
else
0 commit comments