Skip to content

Commit e9c001c

Browse files
authored
Merge pull request #128 from stadelmanma/f23-features
Add F2023 features
2 parents a86dce3 + 9972242 commit e9c001c

File tree

7 files changed

+523232
-493148
lines changed

7 files changed

+523232
-493148
lines changed

grammar.js

+78-7
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)