@@ -493,6 +493,7 @@ module.exports = grammar({
493493 $ . public_statement ,
494494 $ . private_statement ,
495495 $ . enum ,
496+ $ . enumeration_type ,
496497 $ . interface ,
497498 $ . derived_type_definition ,
498499 seq ( $ . namelist_statement , $ . _end_of_statement ) ,
@@ -756,7 +757,8 @@ module.exports = grammar({
756757 field ( 'type' , choice (
757758 $ . intrinsic_type ,
758759 $ . derived_type ,
759- alias ( $ . procedure_declaration , $ . procedure )
760+ alias ( $ . procedure_declaration , $ . procedure ) ,
761+ $ . declared_type ,
760762 ) ) ,
761763 optional ( seq ( ',' ,
762764 commaSep1 (
@@ -867,6 +869,19 @@ module.exports = grammar({
867869 ')'
868870 ) ,
869871
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+
870885 unlimited_polymorphic : $ => '*' ,
871886
872887 kind : $ => choice (
@@ -915,6 +930,10 @@ module.exports = grammar({
915930 caseInsensitive ( 'private' ) ,
916931 caseInsensitive ( 'protected' ) ,
917932 caseInsensitive ( 'public' ) ,
933+ seq (
934+ caseInsensitive ( 'rank' ) ,
935+ $ . argument_list
936+ ) ,
918937 caseInsensitive ( 'save' ) ,
919938 caseInsensitive ( 'sequence' ) ,
920939 caseInsensitive ( 'shared' ) ,
@@ -940,7 +959,8 @@ module.exports = grammar({
940959 caseInsensitive ( 'impure' ) ,
941960 caseInsensitive ( 'module' ) ,
942961 caseInsensitive ( 'pure' ) ,
943- caseInsensitive ( 'recursive' )
962+ caseInsensitive ( 'recursive' ) ,
963+ caseInsensitive ( 'simple' ) ,
944964 ) ,
945965
946966 parameter_statement : $ => prec ( 1 , seq (
@@ -1198,8 +1218,13 @@ module.exports = grammar({
11981218 seq (
11991219 caseInsensitive ( 'default' ) ,
12001220 '(' , caseInsensitive ( 'none' ) , ')'
1201- )
1221+ ) ,
1222+ seq (
1223+ caseInsensitive ( 'reduce' ) ,
1224+ '(' , $ . binary_op , ':' , commaSep1 ( $ . identifier ) , ')' ,
1225+ ) ,
12021226 ) ,
1227+ binary_op : $ => choice ( '+' , '*' , / ( \. \w + \. | \w + ) / ) ,
12031228
12041229 if_statement : $ => choice (
12051230 $ . _inline_if_statement ,
@@ -1435,7 +1460,7 @@ module.exports = grammar({
14351460 $ . extent_specifier
14361461 ) ) ,
14371462
1438- rank_statement : $ => seq (
1463+ rank_statement : $ => prec ( 2 , seq (
14391464 caseInsensitive ( 'rank' ) ,
14401465 choice (
14411466 seq ( '(' , $ . case_value_range_list , ')' ) ,
@@ -1444,7 +1469,7 @@ module.exports = grammar({
14441469 optional ( $ . _block_label ) ,
14451470 $ . _end_of_statement ,
14461471 repeat ( $ . _statement )
1447- ) ,
1472+ ) ) ,
14481473
14491474 block_construct : $ => seq (
14501475 optional ( $ . block_label_start_expression ) ,
@@ -1587,6 +1612,21 @@ module.exports = grammar({
15871612 $ . language_binding
15881613 ) ,
15891614
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+
15901630 enumerator_statement : $ => seq (
15911631 caseInsensitive ( 'enumerator' ) ,
15921632 optional ( '::' ) ,
@@ -1597,6 +1637,12 @@ module.exports = grammar({
15971637 ) ,
15981638
15991639 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+ ) ,
16001646
16011647 // precedence is used to override a conflict with the complex literal
16021648 unit_identifier : $ => prec ( 1 , choice (
@@ -1715,6 +1761,7 @@ module.exports = grammar({
17151761 $ . call_expression ,
17161762 $ . implied_do_loop_expression ,
17171763 $ . coarray_expression ,
1764+ $ . conditional_expression ,
17181765 ) ,
17191766
17201767 parenthesized_expression : $ => seq (
@@ -1840,7 +1887,9 @@ module.exports = grammar({
18401887 $ . extent_specifier ,
18411888 $ . assumed_size ,
18421889 $ . assumed_rank ,
1843- $ . _expression
1890+ $ . _expression ,
1891+ $ . multiple_subscript ,
1892+ $ . multiple_subscript_triplet ,
18441893 ) ) ,
18451894 ')'
18461895 )
@@ -1855,12 +1904,16 @@ module.exports = grammar({
18551904 field ( "value" , choice ( $ . _expression , $ . assumed_size , $ . assumed_shape ) )
18561905 ) ) ,
18571906
1858- extent_specifier : $ => seq (
1907+ _extent_specifier : $ => seq (
18591908 optional ( $ . _expression ) , // start
18601909 ':' ,
18611910 optional ( choice ( $ . _expression , $ . assumed_size ) ) , // stop
18621911 optional ( seq ( ':' , $ . _expression ) ) // stride
18631912 ) ,
1913+ extent_specifier : $ => $ . _extent_specifier ,
1914+
1915+ multiple_subscript : $ => seq ( '@' , $ . _expression ) ,
1916+ multiple_subscript_triplet : $ => seq ( '@' , $ . _extent_specifier ) ,
18641917
18651918 assumed_size : $ => '*' ,
18661919
@@ -2016,6 +2069,11 @@ module.exports = grammar({
20162069 ) ,
20172070 $ . argument_list ,
20182071 ) ) ,
2072+ seq (
2073+ caseInsensitive ( 'notify' ) ,
2074+ caseInsensitive ( 'wait' ) ,
2075+ $ . argument_list ,
2076+ ) ,
20192077 ) ,
20202078
20212079 coarray_team_statement : $ => seq (
@@ -2048,6 +2106,18 @@ module.exports = grammar({
20482106 optional ( $ . _block_label ) ,
20492107 ) ,
20502108
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+
20512121 // Fortran doesn't have reserved keywords, and to allow _just
20522122 // enough_ ambiguity so that tree-sitter can parse tokens
20532123 // correctly as either a keyword or a plain identifier, we must
@@ -2090,6 +2160,7 @@ module.exports = grammar({
20902160 caseInsensitive ( 'pointer' ) ,
20912161 caseInsensitive ( 'private' ) ,
20922162 caseInsensitive ( 'public' ) ,
2163+ prec ( - 1 , caseInsensitive ( 'rank' ) ) ,
20932164 caseInsensitive ( 'read' ) ,
20942165 caseInsensitive ( 'real' ) ,
20952166 caseInsensitive ( 'save' ) ,
0 commit comments