@@ -100,6 +100,14 @@ module.exports = grammar({
100
100
[ $ . format_statement , $ . identifier ] ,
101
101
[ $ . _inline_if_statement , $ . arithmetic_if_statement , $ . _block_if_statement , $ . identifier ] ,
102
102
[ $ . file_position_statement , $ . identifier ] ,
103
+ [ $ . cray_pointer_declaration , $ . identifier ] ,
104
+ ] ,
105
+
106
+ supertypes : $ => [
107
+ $ . _specification_parts ,
108
+ $ . _expression ,
109
+ $ . _statements ,
110
+ $ . _argument_item ,
103
111
] ,
104
112
105
113
rules : {
@@ -403,7 +411,7 @@ module.exports = grammar({
403
411
} ,
404
412
405
413
assignment : $ => seq ( caseInsensitive ( 'assignment' ) , '(' , '=' , ')' ) ,
406
- operator : $ => seq ( caseInsensitive ( 'operator' ) , '(' , / [ ^ ( ) ] + / , ')' ) ,
414
+ operator : $ => seq ( caseInsensitive ( 'operator' ) , '(' , alias ( / [ ^ ( ) ] + / , $ . operator_name ) , ')' ) ,
407
415
defined_io_procedure : $ => seq (
408
416
choice ( caseInsensitive ( 'read' ) , caseInsensitive ( 'write' ) ) ,
409
417
'(' ,
@@ -527,25 +535,14 @@ module.exports = grammar({
527
535
// Variable Declarations
528
536
529
537
_specification_part : $ => prec ( 1 , choice (
530
- $ . include_statement ,
531
- seq ( $ . use_statement , $ . _end_of_statement ) ,
532
- seq ( $ . implicit_statement , $ . _end_of_statement ) ,
533
- seq ( $ . save_statement , $ . _end_of_statement ) ,
534
- seq ( $ . import_statement , $ . _end_of_statement ) ,
535
- $ . public_statement ,
536
- $ . private_statement ,
537
- $ . enum ,
538
- $ . enumeration_type ,
538
+ // Split out so it can be used as a supertype
539
+ seq ( $ . _specification_parts , $ . _end_of_statement ) ,
540
+ // These two can't be included in the above because or we
541
+ // duplicate the end_of_statement in the end block rule
539
542
$ . interface ,
540
543
$ . derived_type_definition ,
541
- seq ( $ . namelist_statement , $ . _end_of_statement ) ,
542
- seq ( $ . common_statement , $ . _end_of_statement ) ,
543
- seq ( $ . variable_declaration , $ . _end_of_statement ) ,
544
- seq ( $ . variable_modification , $ . _end_of_statement ) ,
545
- seq ( $ . parameter_statement , $ . _end_of_statement ) ,
546
- seq ( $ . equivalence_statement , $ . _end_of_statement ) ,
547
- seq ( $ . data_statement , $ . _end_of_statement ) ,
548
- seq ( $ . assignment_statement , $ . _end_of_statement ) ,
544
+ // This allows format statements in the specification part,
545
+ // without making the statements rule particularly awkward
549
546
prec ( 1 , seq ( $ . statement_label , $ . format_statement , $ . _end_of_statement ) ) ,
550
547
$ . preproc_include ,
551
548
$ . preproc_def ,
@@ -556,6 +553,28 @@ module.exports = grammar({
556
553
';' ,
557
554
) ) ,
558
555
556
+ _specification_parts : $ => prec ( 1 , choice (
557
+ $ . include_statement ,
558
+ $ . use_statement ,
559
+ $ . implicit_statement ,
560
+ $ . save_statement ,
561
+ $ . import_statement ,
562
+ $ . public_statement ,
563
+ $ . private_statement ,
564
+ $ . enum ,
565
+ $ . enumeration_type ,
566
+ $ . namelist_statement ,
567
+ $ . common_statement ,
568
+ $ . variable_declaration ,
569
+ $ . variable_modification ,
570
+ $ . parameter_statement ,
571
+ $ . equivalence_statement ,
572
+ $ . data_statement ,
573
+ $ . cray_pointer_declaration ,
574
+ // This catches statement functions, which are completely ambiguous
575
+ $ . assignment_statement ,
576
+ ) ) ,
577
+
559
578
use_statement : $ => seq (
560
579
caseInsensitive ( 'use' ) ,
561
580
choice (
@@ -570,7 +589,7 @@ module.exports = grammar({
570
589
seq ( ',' , commaSep1 ( $ . use_alias ) ) ,
571
590
$ . included_items
572
591
)
573
- )
592
+ ) ,
574
593
) ,
575
594
576
595
included_items : $ => seq (
@@ -611,7 +630,7 @@ module.exports = grammar({
611
630
')'
612
631
) )
613
632
)
614
- )
633
+ ) ,
615
634
) ,
616
635
617
636
save_statement : $ => prec ( 1 , seq (
@@ -622,7 +641,7 @@ module.exports = grammar({
622
641
$ . identifier ,
623
642
seq ( '/' , $ . identifier , '/' ) ,
624
643
) ) ,
625
- ) )
644
+ ) ) ,
626
645
) ) ,
627
646
628
647
private_statement : $ => prec . right ( 1 , seq (
@@ -631,7 +650,6 @@ module.exports = grammar({
631
650
optional ( '::' ) ,
632
651
commaSep1 ( choice ( $ . identifier , $ . _generic_procedure ) )
633
652
) ) ,
634
- $ . _end_of_statement ,
635
653
) ) ,
636
654
637
655
public_statement : $ => prec . right ( 1 , seq (
@@ -640,20 +658,19 @@ module.exports = grammar({
640
658
optional ( '::' ) ,
641
659
commaSep1 ( choice ( $ . identifier , $ . _generic_procedure ) )
642
660
) ) ,
643
- $ . _end_of_statement ,
644
661
) ) ,
645
662
646
663
namelist_statement : $ => seq (
647
664
caseInsensitive ( 'namelist' ) ,
648
- repeat1 ( $ . variable_group )
665
+ repeat1 ( $ . variable_group ) ,
649
666
) ,
650
667
651
668
common_statement : $ => seq (
652
669
caseInsensitive ( 'common' ) ,
653
670
repeat1 ( choice (
654
671
$ . variable_group ,
655
672
commaSep1 ( $ . _variable_declarator )
656
- ) )
673
+ ) ) ,
657
674
) ,
658
675
659
676
variable_group : $ => seq (
@@ -670,7 +687,7 @@ module.exports = grammar({
670
687
671
688
import_statement : $ => prec . left ( seq (
672
689
caseInsensitive ( 'import' ) ,
673
- optional ( $ . _import_names )
690
+ optional ( $ . _import_names ) ,
674
691
) ) ,
675
692
_import_names : $ => choice (
676
693
seq ( optional ( '::' ) , commaSep1 ( $ . identifier ) ) ,
@@ -686,14 +703,16 @@ module.exports = grammar({
686
703
derived_type_definition : $ => seq (
687
704
$ . derived_type_statement ,
688
705
repeat ( choice (
689
- $ . public_statement ,
690
- $ . private_statement ,
691
706
seq (
707
+ choice (
708
+ $ . public_statement ,
709
+ $ . private_statement ,
692
710
alias ( caseInsensitive ( 'sequence' ) , $ . sequence_statement ) ,
693
- $ . _end_of_statement
711
+ $ . include_statement ,
712
+ ) ,
713
+ $ . _end_of_statement
694
714
) ,
695
- $ . include_statement ,
696
- seq ( $ . variable_declaration , $ . _end_of_statement ) ,
715
+ $ . variable_declaration ,
697
716
$ . preproc_include ,
698
717
$ . preproc_def ,
699
718
$ . preproc_function_def ,
@@ -734,7 +753,6 @@ module.exports = grammar({
734
753
seq ( ',' , commaSep1 ( $ . _derived_type_qualifier ) , '::' , $ . _type_name )
735
754
) ,
736
755
optional ( alias ( $ . argument_list , $ . derived_type_parameter_list ) ) ,
737
- $ . _end_of_statement
738
756
) ,
739
757
740
758
end_type_statement : $ => blockStructureEnding ( $ , 'type' ) ,
@@ -767,7 +785,6 @@ module.exports = grammar({
767
785
$ . method_name ,
768
786
$ . binding ,
769
787
) ) ) ,
770
- $ . _end_of_statement ,
771
788
) ,
772
789
binding : $ => seq ( $ . binding_name , '=>' , $ . method_name ) ,
773
790
binding_name : $ => choice (
@@ -817,7 +834,7 @@ module.exports = grammar({
817
834
)
818
835
) ) ,
819
836
optional ( '::' ) ,
820
- $ . _declaration_targets
837
+ $ . _declaration_targets ,
821
838
) ,
822
839
823
840
procedure_declaration : $ => seq (
@@ -1016,14 +1033,14 @@ module.exports = grammar({
1016
1033
caseInsensitive ( 'parameter' ) ,
1017
1034
'(' ,
1018
1035
commaSep1 ( $ . parameter_assignment ) ,
1019
- ')'
1036
+ ')' ,
1020
1037
) ) ,
1021
1038
1022
1039
parameter_assignment : $ => seq ( $ . identifier , '=' , $ . _expression ) ,
1023
1040
1024
1041
equivalence_statement : $ => seq (
1025
1042
caseInsensitive ( 'equivalence' ) ,
1026
- commaSep1 ( $ . equivalence_set )
1043
+ commaSep1 ( $ . equivalence_set ) ,
1027
1044
) ,
1028
1045
1029
1046
equivalence_set : $ => seq (
@@ -1034,6 +1051,18 @@ module.exports = grammar({
1034
1051
')'
1035
1052
) ,
1036
1053
1054
+ cray_pointer_declaration : $ => seq (
1055
+ caseInsensitive ( 'pointer' ) ,
1056
+ commaSep1 ( $ . cray_pointer_pair ) ,
1057
+ ) ,
1058
+ cray_pointer_pair : $ => seq (
1059
+ '(' ,
1060
+ field ( 'pointer' , $ . identifier ) ,
1061
+ ',' ,
1062
+ field ( 'target' , $ . _variable_declarator ) ,
1063
+ ')' ,
1064
+ ) ,
1065
+
1037
1066
// Statements
1038
1067
1039
1068
_statement : $ => choice (
@@ -1048,7 +1077,6 @@ module.exports = grammar({
1048
1077
$ . _statements ,
1049
1078
$ . _end_of_statement
1050
1079
) ,
1051
- $ . include_statement ,
1052
1080
';'
1053
1081
) ,
1054
1082
@@ -1088,6 +1116,7 @@ module.exports = grammar({
1088
1116
$ . coarray_critical_statement ,
1089
1117
// Not strictly valid, but can catch extensions and preprocessor macros
1090
1118
$ . call_expression ,
1119
+ $ . include_statement ,
1091
1120
) ,
1092
1121
1093
1122
statement_label : $ => prec ( 1 , alias ( $ . _integer_literal , 'statement_label' ) ) ,
@@ -1163,12 +1192,11 @@ module.exports = grammar({
1163
1192
include_statement : $ => prec ( 1 , seq (
1164
1193
caseInsensitive ( 'include' ) ,
1165
1194
field ( "path" , alias ( $ . string_literal , $ . filename ) ) ,
1166
- $ . _end_of_statement ,
1167
1195
) ) ,
1168
1196
1169
1197
data_statement : $ => seq (
1170
1198
caseInsensitive ( 'data' ) ,
1171
- sep1 ( $ . data_set , optional ( ',' ) )
1199
+ sep1 ( $ . data_set , optional ( ',' ) ) ,
1172
1200
) ,
1173
1201
data_set : $ => prec ( 1 , seq (
1174
1202
commaSep1 (
@@ -1663,7 +1691,6 @@ module.exports = grammar({
1663
1691
$ . enum_statement ,
1664
1692
repeat ( $ . enumerator_statement ) ,
1665
1693
$ . end_enum_statement ,
1666
- $ . _end_of_statement
1667
1694
) ,
1668
1695
1669
1696
enum_statement : $ => seq (
@@ -1677,7 +1704,6 @@ module.exports = grammar({
1677
1704
$ . enumeration_type_statement ,
1678
1705
repeat ( $ . enumerator_statement ) ,
1679
1706
$ . end_enumeration_type_statement ,
1680
- $ . _end_of_statement
1681
1707
) ,
1682
1708
1683
1709
enumeration_type_statement : $ => seq (
@@ -1964,21 +1990,16 @@ module.exports = grammar({
1964
1990
// Unnamed node so we can reuse it for e.g. kind
1965
1991
_argument_list : $ => prec . dynamic (
1966
1992
1 ,
1967
- seq (
1968
- '(' ,
1969
- commaSep ( choice (
1970
- $ . keyword_argument ,
1971
- $ . extent_specifier ,
1972
- $ . assumed_size ,
1973
- $ . assumed_rank ,
1974
- $ . _expression ,
1975
- $ . multiple_subscript ,
1976
- $ . multiple_subscript_triplet ,
1977
- ) ) ,
1978
- ')'
1979
- )
1993
+ seq ( '(' , commaSep ( choice ( $ . _expression , $ . _argument_item ) ) , ')' )
1994
+ ) ,
1995
+ _argument_item : $ => choice (
1996
+ $ . keyword_argument ,
1997
+ $ . extent_specifier ,
1998
+ $ . assumed_size ,
1999
+ $ . assumed_rank ,
2000
+ $ . multiple_subscript ,
2001
+ $ . multiple_subscript_triplet ,
1980
2002
) ,
1981
-
1982
2003
argument_list : $ => $ . _argument_list ,
1983
2004
1984
2005
// precedence is used to prevent conflict with assignment expression
0 commit comments