@@ -493,6 +493,7 @@ module.exports = grammar({
493
493
$ . public_statement ,
494
494
$ . private_statement ,
495
495
$ . enum ,
496
+ $ . enumeration_type ,
496
497
$ . interface ,
497
498
$ . derived_type_definition ,
498
499
seq ( $ . namelist_statement , $ . _end_of_statement ) ,
@@ -756,7 +757,8 @@ module.exports = grammar({
756
757
field ( 'type' , choice (
757
758
$ . intrinsic_type ,
758
759
$ . derived_type ,
759
- alias ( $ . procedure_declaration , $ . procedure )
760
+ alias ( $ . procedure_declaration , $ . procedure ) ,
761
+ $ . declared_type ,
760
762
) ) ,
761
763
optional ( seq ( ',' ,
762
764
commaSep1 (
@@ -867,6 +869,19 @@ module.exports = grammar({
867
869
')'
868
870
) ,
869
871
872
+ declared_type : $ => seq (
873
+ choice (
874
+ caseInsensitive ( 'typeof' ) ,
875
+ caseInsensitive ( 'classof' ) ,
876
+ ) ,
877
+ '(' ,
878
+ field ( 'name' , choice (
879
+ $ . identifier ,
880
+ $ . derived_type_member_expression ,
881
+ ) ) ,
882
+ ')'
883
+ ) ,
884
+
870
885
unlimited_polymorphic : $ => '*' ,
871
886
872
887
kind : $ => choice (
@@ -915,6 +930,10 @@ module.exports = grammar({
915
930
caseInsensitive ( 'private' ) ,
916
931
caseInsensitive ( 'protected' ) ,
917
932
caseInsensitive ( 'public' ) ,
933
+ seq (
934
+ caseInsensitive ( 'rank' ) ,
935
+ $ . argument_list
936
+ ) ,
918
937
caseInsensitive ( 'save' ) ,
919
938
caseInsensitive ( 'sequence' ) ,
920
939
caseInsensitive ( 'shared' ) ,
@@ -940,7 +959,8 @@ module.exports = grammar({
940
959
caseInsensitive ( 'impure' ) ,
941
960
caseInsensitive ( 'module' ) ,
942
961
caseInsensitive ( 'pure' ) ,
943
- caseInsensitive ( 'recursive' )
962
+ caseInsensitive ( 'recursive' ) ,
963
+ caseInsensitive ( 'simple' ) ,
944
964
) ,
945
965
946
966
parameter_statement : $ => prec ( 1 , seq (
@@ -1198,8 +1218,13 @@ module.exports = grammar({
1198
1218
seq (
1199
1219
caseInsensitive ( 'default' ) ,
1200
1220
'(' , caseInsensitive ( 'none' ) , ')'
1201
- )
1221
+ ) ,
1222
+ seq (
1223
+ caseInsensitive ( 'reduce' ) ,
1224
+ '(' , $ . binary_op , ':' , commaSep1 ( $ . identifier ) , ')' ,
1225
+ ) ,
1202
1226
) ,
1227
+ binary_op : $ => choice ( '+' , '*' , / ( \. \w + \. | \w + ) / ) ,
1203
1228
1204
1229
if_statement : $ => choice (
1205
1230
$ . _inline_if_statement ,
@@ -1435,7 +1460,7 @@ module.exports = grammar({
1435
1460
$ . extent_specifier
1436
1461
) ) ,
1437
1462
1438
- rank_statement : $ => seq (
1463
+ rank_statement : $ => prec ( 2 , seq (
1439
1464
caseInsensitive ( 'rank' ) ,
1440
1465
choice (
1441
1466
seq ( '(' , $ . case_value_range_list , ')' ) ,
@@ -1444,7 +1469,7 @@ module.exports = grammar({
1444
1469
optional ( $ . _block_label ) ,
1445
1470
$ . _end_of_statement ,
1446
1471
repeat ( $ . _statement )
1447
- ) ,
1472
+ ) ) ,
1448
1473
1449
1474
block_construct : $ => seq (
1450
1475
optional ( $ . block_label_start_expression ) ,
@@ -1587,6 +1612,21 @@ module.exports = grammar({
1587
1612
$ . language_binding
1588
1613
) ,
1589
1614
1615
+ enumeration_type : $ => seq (
1616
+ $ . enumeration_type_statement ,
1617
+ repeat ( $ . enumerator_statement ) ,
1618
+ $ . end_enumeration_type_statement ,
1619
+ $ . _end_of_statement
1620
+ ) ,
1621
+
1622
+ enumeration_type_statement : $ => seq (
1623
+ caseInsensitive ( 'enumeration' ) ,
1624
+ caseInsensitive ( 'type' ) ,
1625
+ optional ( seq ( ',' , $ . access_specifier ) ) ,
1626
+ optional ( '::' ) ,
1627
+ $ . _type_name ,
1628
+ ) ,
1629
+
1590
1630
enumerator_statement : $ => seq (
1591
1631
caseInsensitive ( 'enumerator' ) ,
1592
1632
optional ( '::' ) ,
@@ -1597,6 +1637,12 @@ module.exports = grammar({
1597
1637
) ,
1598
1638
1599
1639
end_enum_statement : $ => whiteSpacedKeyword ( 'end' , 'enum' ) ,
1640
+ end_enumeration_type_statement : $ => seq (
1641
+ caseInsensitive ( 'end' ) ,
1642
+ caseInsensitive ( 'enumeration' ) ,
1643
+ caseInsensitive ( 'type' ) ,
1644
+ optional ( $ . _name )
1645
+ ) ,
1600
1646
1601
1647
// precedence is used to override a conflict with the complex literal
1602
1648
unit_identifier : $ => prec ( 1 , choice (
@@ -1715,6 +1761,7 @@ module.exports = grammar({
1715
1761
$ . call_expression ,
1716
1762
$ . implied_do_loop_expression ,
1717
1763
$ . coarray_expression ,
1764
+ $ . conditional_expression ,
1718
1765
) ,
1719
1766
1720
1767
parenthesized_expression : $ => seq (
@@ -1840,7 +1887,9 @@ module.exports = grammar({
1840
1887
$ . extent_specifier ,
1841
1888
$ . assumed_size ,
1842
1889
$ . assumed_rank ,
1843
- $ . _expression
1890
+ $ . _expression ,
1891
+ $ . multiple_subscript ,
1892
+ $ . multiple_subscript_triplet ,
1844
1893
) ) ,
1845
1894
')'
1846
1895
)
@@ -1855,12 +1904,16 @@ module.exports = grammar({
1855
1904
field ( "value" , choice ( $ . _expression , $ . assumed_size , $ . assumed_shape ) )
1856
1905
) ) ,
1857
1906
1858
- extent_specifier : $ => seq (
1907
+ _extent_specifier : $ => seq (
1859
1908
optional ( $ . _expression ) , // start
1860
1909
':' ,
1861
1910
optional ( choice ( $ . _expression , $ . assumed_size ) ) , // stop
1862
1911
optional ( seq ( ':' , $ . _expression ) ) // stride
1863
1912
) ,
1913
+ extent_specifier : $ => $ . _extent_specifier ,
1914
+
1915
+ multiple_subscript : $ => seq ( '@' , $ . _expression ) ,
1916
+ multiple_subscript_triplet : $ => seq ( '@' , $ . _extent_specifier ) ,
1864
1917
1865
1918
assumed_size : $ => '*' ,
1866
1919
@@ -2016,6 +2069,11 @@ module.exports = grammar({
2016
2069
) ,
2017
2070
$ . argument_list ,
2018
2071
) ) ,
2072
+ seq (
2073
+ caseInsensitive ( 'notify' ) ,
2074
+ caseInsensitive ( 'wait' ) ,
2075
+ $ . argument_list ,
2076
+ ) ,
2019
2077
) ,
2020
2078
2021
2079
coarray_team_statement : $ => seq (
@@ -2048,6 +2106,18 @@ module.exports = grammar({
2048
2106
optional ( $ . _block_label ) ,
2049
2107
) ,
2050
2108
2109
+ conditional_expression : $ => seq (
2110
+ field ( 'condition' , $ . _expression ) ,
2111
+ '?' ,
2112
+ field ( 'consequence' , choice ( prec . left ( $ . _expression ) , $ . nil_literal ) ) ,
2113
+ ':' ,
2114
+ field ( 'alternative' , choice ( prec . left ( $ . _expression ) , $ . nil_literal ) ) ,
2115
+ ) ,
2116
+
2117
+ // Strictly only valid when used in a conditional_expression as an
2118
+ // actual argument
2119
+ nil_literal : $ => caseInsensitive ( '\\.nil\\.' ) ,
2120
+
2051
2121
// Fortran doesn't have reserved keywords, and to allow _just
2052
2122
// enough_ ambiguity so that tree-sitter can parse tokens
2053
2123
// correctly as either a keyword or a plain identifier, we must
@@ -2090,6 +2160,7 @@ module.exports = grammar({
2090
2160
caseInsensitive ( 'pointer' ) ,
2091
2161
caseInsensitive ( 'private' ) ,
2092
2162
caseInsensitive ( 'public' ) ,
2163
+ prec ( - 1 , caseInsensitive ( 'rank' ) ) ,
2093
2164
caseInsensitive ( 'read' ) ,
2094
2165
caseInsensitive ( 'real' ) ,
2095
2166
caseInsensitive ( 'save' ) ,
0 commit comments