Skip to content

Commit b7da5b8

Browse files
committed
Ensure operator names appear in the syntax tree
Previously, operator names were defined using regexes, preventing them from being explicitly represented in the tree. This commit ensures that operator names are parsed as distinct nodes, making them accessible to third-party libraries/users/consumers.
1 parent d563cbf commit b7da5b8

File tree

7 files changed

+100
-45
lines changed

7 files changed

+100
-45
lines changed

grammar.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,8 @@ module.exports = grammar({
428428
),
429429

430430
assignment: $ => seq(caseInsensitive('assignment'), '(', '=', ')'),
431-
operator: $ => seq(caseInsensitive('operator'), '(', /[^()]+/, ')'),
431+
operator: $ => seq(caseInsensitive('operator'), '(', $.operator_name, ')'),
432+
operator_name: $ => /[^()]+/,
432433
defined_io_procedure: $ => seq(
433434
choice(caseInsensitive('read'), caseInsensitive('write')),
434435
'(',
@@ -1934,8 +1935,9 @@ module.exports = grammar({
19341935
)),
19351936

19361937
user_defined_operator: $ => prec.right(seq(
1937-
'.', /[a-zA-Z]+/, '.'
1938+
'.', $.user_defined_operator_name, '.'
19381939
)),
1940+
user_defined_operator_name: $ => /[a-zA-Z]+/,
19391941

19401942
// Due to the fact Fortran uses parentheses for both function calls and
19411943
// array access there is no way to differentiate the two except for the

src/grammar.json

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8181,15 +8181,19 @@
81818181
"value": "("
81828182
},
81838183
{
8184-
"type": "PATTERN",
8185-
"value": "[^()]+"
8184+
"type": "SYMBOL",
8185+
"name": "operator_name"
81868186
},
81878187
{
81888188
"type": "STRING",
81898189
"value": ")"
81908190
}
81918191
]
81928192
},
8193+
"operator_name": {
8194+
"type": "PATTERN",
8195+
"value": "[^()]+"
8196+
},
81938197
"defined_io_procedure": {
81948198
"type": "SEQ",
81958199
"members": [
@@ -18858,8 +18862,8 @@
1885818862
"value": "."
1885918863
},
1886018864
{
18861-
"type": "PATTERN",
18862-
"value": "[a-zA-Z]+"
18865+
"type": "SYMBOL",
18866+
"name": "user_defined_operator_name"
1886318867
},
1886418868
{
1886518869
"type": "STRING",
@@ -18868,6 +18872,10 @@
1886818872
]
1886918873
}
1887018874
},
18875+
"user_defined_operator_name": {
18876+
"type": "PATTERN",
18877+
"value": "[a-zA-Z]+"
18878+
},
1887118879
"call_expression": {
1887218880
"type": "PREC",
1887318881
"value": 80,

src/node-types.json

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9717,7 +9717,17 @@
97179717
{
97189718
"type": "operator",
97199719
"named": true,
9720-
"fields": {}
9720+
"fields": {},
9721+
"children": {
9722+
"multiple": false,
9723+
"required": true,
9724+
"types": [
9725+
{
9726+
"type": "operator_name",
9727+
"named": true
9728+
}
9729+
]
9730+
}
97219731
},
97229732
{
97239733
"type": "output_item_list",
@@ -14684,7 +14694,17 @@
1468414694
{
1468514695
"type": "user_defined_operator",
1468614696
"named": true,
14687-
"fields": {}
14697+
"fields": {},
14698+
"children": {
14699+
"multiple": false,
14700+
"required": true,
14701+
"types": [
14702+
{
14703+
"type": "user_defined_operator_name",
14704+
"named": true
14705+
}
14706+
]
14707+
}
1468814708
},
1468914709
{
1469014710
"type": "variable_attributes",
@@ -15709,6 +15729,10 @@
1570915729
"type": "operator",
1571015730
"named": false
1571115731
},
15732+
{
15733+
"type": "operator_name",
15734+
"named": true
15735+
},
1571215736
{
1571315737
"type": "optional",
1571415738
"named": false
@@ -15921,6 +15945,10 @@
1592115945
"type": "use",
1592215946
"named": false
1592315947
},
15948+
{
15949+
"type": "user_defined_operator_name",
15950+
"named": true
15951+
},
1592415952
{
1592515953
"type": "value",
1592615954
"named": false

src/parser.c

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ enum ts_symbol_identifiers {
8383
aux_sym_assignment_token1 = 57,
8484
anon_sym_EQ = 58,
8585
aux_sym_operator_token1 = 59,
86-
aux_sym_operator_token2 = 60,
86+
sym_operator_name = 60,
8787
aux_sym_defined_io_procedure_token1 = 61,
8888
aux_sym_defined_io_procedure_token2 = 62,
8989
aux_sym_defined_io_procedure_token3 = 63,
@@ -255,7 +255,7 @@ enum ts_symbol_identifiers {
255255
anon_sym_SLASH_SLASH = 229,
256256
anon_sym_STAR_STAR = 230,
257257
anon_sym_DOT = 231,
258-
aux_sym_user_defined_operator_token1 = 232,
258+
sym_user_defined_operator_name = 232,
259259
anon_sym_AT = 233,
260260
sym_assumed_rank = 234,
261261
anon_sym_LPAREN_SLASH = 235,
@@ -800,7 +800,7 @@ static const char * const ts_symbol_names[] = {
800800
[aux_sym_assignment_token1] = "assignment",
801801
[anon_sym_EQ] = "=",
802802
[aux_sym_operator_token1] = "operator",
803-
[aux_sym_operator_token2] = "operator_token2",
803+
[sym_operator_name] = "operator_name",
804804
[aux_sym_defined_io_procedure_token1] = "defined_io_procedure_token1",
805805
[aux_sym_defined_io_procedure_token2] = "defined_io_procedure_token2",
806806
[aux_sym_defined_io_procedure_token3] = "formatted",
@@ -972,7 +972,7 @@ static const char * const ts_symbol_names[] = {
972972
[anon_sym_SLASH_SLASH] = "//",
973973
[anon_sym_STAR_STAR] = "**",
974974
[anon_sym_DOT] = ".",
975-
[aux_sym_user_defined_operator_token1] = "user_defined_operator_token1",
975+
[sym_user_defined_operator_name] = "user_defined_operator_name",
976976
[anon_sym_AT] = "@",
977977
[sym_assumed_rank] = "assumed_rank",
978978
[anon_sym_LPAREN_SLASH] = "(/",
@@ -1517,7 +1517,7 @@ static const TSSymbol ts_symbol_map[] = {
15171517
[aux_sym_assignment_token1] = aux_sym_assignment_token1,
15181518
[anon_sym_EQ] = anon_sym_EQ,
15191519
[aux_sym_operator_token1] = aux_sym_operator_token1,
1520-
[aux_sym_operator_token2] = aux_sym_operator_token2,
1520+
[sym_operator_name] = sym_operator_name,
15211521
[aux_sym_defined_io_procedure_token1] = aux_sym_defined_io_procedure_token1,
15221522
[aux_sym_defined_io_procedure_token2] = aux_sym_defined_io_procedure_token2,
15231523
[aux_sym_defined_io_procedure_token3] = aux_sym_defined_io_procedure_token3,
@@ -1689,7 +1689,7 @@ static const TSSymbol ts_symbol_map[] = {
16891689
[anon_sym_SLASH_SLASH] = anon_sym_SLASH_SLASH,
16901690
[anon_sym_STAR_STAR] = anon_sym_STAR_STAR,
16911691
[anon_sym_DOT] = anon_sym_DOT,
1692-
[aux_sym_user_defined_operator_token1] = aux_sym_user_defined_operator_token1,
1692+
[sym_user_defined_operator_name] = sym_user_defined_operator_name,
16931693
[anon_sym_AT] = anon_sym_AT,
16941694
[sym_assumed_rank] = sym_assumed_rank,
16951695
[anon_sym_LPAREN_SLASH] = anon_sym_LPAREN_SLASH,
@@ -2414,9 +2414,9 @@ static const TSSymbolMetadata ts_symbol_metadata[] = {
24142414
.visible = true,
24152415
.named = false,
24162416
},
2417-
[aux_sym_operator_token2] = {
2418-
.visible = false,
2419-
.named = false,
2417+
[sym_operator_name] = {
2418+
.visible = true,
2419+
.named = true,
24202420
},
24212421
[aux_sym_defined_io_procedure_token1] = {
24222422
.visible = false,
@@ -3102,9 +3102,9 @@ static const TSSymbolMetadata ts_symbol_metadata[] = {
31023102
.visible = true,
31033103
.named = false,
31043104
},
3105-
[aux_sym_user_defined_operator_token1] = {
3106-
.visible = false,
3107-
.named = false,
3105+
[sym_user_defined_operator_name] = {
3106+
.visible = true,
3107+
.named = true,
31083108
},
31093109
[anon_sym_AT] = {
31103110
.visible = true,
@@ -32370,29 +32370,29 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) {
3237032370
('a' <= lookahead && lookahead <= 'z')) ADVANCE(2754);
3237132371
END_STATE();
3237232372
case 1548:
32373-
ACCEPT_TOKEN(aux_sym_operator_token2);
32373+
ACCEPT_TOKEN(sym_operator_name);
3237432374
if (lookahead == '\n') ADVANCE(1551);
3237532375
if (lookahead == '\r') ADVANCE(1549);
3237632376
if (lookahead != 0 &&
3237732377
lookahead != '(' &&
3237832378
lookahead != ')') ADVANCE(1552);
3237932379
END_STATE();
3238032380
case 1549:
32381-
ACCEPT_TOKEN(aux_sym_operator_token2);
32381+
ACCEPT_TOKEN(sym_operator_name);
3238232382
if (lookahead == '\n') ADVANCE(1551);
3238332383
if (lookahead != 0 &&
3238432384
lookahead != '(' &&
3238532385
lookahead != ')') ADVANCE(1552);
3238632386
END_STATE();
3238732387
case 1550:
32388-
ACCEPT_TOKEN(aux_sym_operator_token2);
32388+
ACCEPT_TOKEN(sym_operator_name);
3238932389
if (lookahead == '\n') ADVANCE(1552);
3239032390
if (lookahead == '(' ||
3239132391
lookahead == ')') ADVANCE(2759);
3239232392
if (lookahead != 0) ADVANCE(1550);
3239332393
END_STATE();
3239432394
case 1551:
32395-
ACCEPT_TOKEN(aux_sym_operator_token2);
32395+
ACCEPT_TOKEN(sym_operator_name);
3239632396
if (lookahead == '!') ADVANCE(1550);
3239732397
if (lookahead == '&') ADVANCE(1456);
3239832398
if (lookahead == '\\') ADVANCE(1548);
@@ -32403,7 +32403,7 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) {
3240332403
lookahead != ')') ADVANCE(1552);
3240432404
END_STATE();
3240532405
case 1552:
32406-
ACCEPT_TOKEN(aux_sym_operator_token2);
32406+
ACCEPT_TOKEN(sym_operator_name);
3240732407
if (lookahead != 0 &&
3240832408
lookahead != '(' &&
3240932409
lookahead != ')') ADVANCE(1552);
@@ -34438,7 +34438,7 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) {
3443834438
lookahead == 't') ADVANCE(1138);
3443934439
END_STATE();
3444034440
case 1894:
34441-
ACCEPT_TOKEN(aux_sym_user_defined_operator_token1);
34441+
ACCEPT_TOKEN(sym_user_defined_operator_name);
3444234442
if (('A' <= lookahead && lookahead <= 'Z') ||
3444334443
('a' <= lookahead && lookahead <= 'z')) ADVANCE(1894);
3444434444
END_STATE();
@@ -907274,7 +907274,7 @@ static const uint16_t ts_small_parse_table[] = {
907274907274
sym_comment,
907275907275
[160198] = 2,
907276907276
ACTIONS(19230), 1,
907277-
aux_sym_operator_token2,
907277+
sym_operator_name,
907278907278
ACTIONS(3), 2,
907279907279
anon_sym_AMP,
907280907280
sym_comment,
@@ -910478,7 +910478,7 @@ static const uint16_t ts_small_parse_table[] = {
910478910478
sym_comment,
910479910479
[164470] = 2,
910480910480
ACTIONS(20206), 1,
910481-
aux_sym_operator_token2,
910481+
sym_operator_name,
910482910482
ACTIONS(3), 2,
910483910483
anon_sym_AMP,
910484910484
sym_comment,
@@ -911684,7 +911684,7 @@ static const uint16_t ts_small_parse_table[] = {
911684911684
sym_comment,
911685911685
[166078] = 2,
911686911686
ACTIONS(20582), 1,
911687-
aux_sym_user_defined_operator_token1,
911687+
sym_user_defined_operator_name,
911688911688
ACTIONS(21), 2,
911689911689
anon_sym_AMP,
911690911690
sym_comment,

test/corpus/constructs.txt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,8 @@ end interface operator (.not.)
416416
(translation_unit
417417
(interface
418418
(interface_statement
419-
(operator)
419+
(operator
420+
(operator_name))
420421
(end_of_statement))
421422
(procedure_statement
422423
(procedure_kind)
@@ -429,11 +430,13 @@ end interface operator (.not.)
429430
(name))
430431
(end_of_statement))
431432
(end_interface_statement
432-
(operator)
433+
(operator
434+
(operator_name))
433435
(end_of_statement)))
434436
(interface
435437
(interface_statement
436-
(operator)
438+
(operator
439+
(operator_name))
437440
(end_of_statement))
438441
(procedure_statement
439442
(procedure_kind)
@@ -458,7 +461,8 @@ end interface operator (.not.)
458461
(end_function_statement
459462
(end_of_statement)))
460463
(end_interface_statement
461-
(operator)
464+
(operator
465+
(operator_name))
462466
(end_of_statement))))
463467

464468
================================================================================
@@ -496,7 +500,8 @@ interface operator(+) ; module procedure test_plus ; end interface
496500
(translation_unit
497501
(interface
498502
(interface_statement
499-
(operator)
503+
(operator
504+
(operator_name))
500505
(end_of_statement))
501506
(procedure_statement
502507
(procedure_kind)
@@ -527,14 +532,16 @@ end module
527532
(module_name
528533
(name))
529534
(included_items
530-
(operator)
535+
(operator
536+
(operator_name))
531537
(assignment)))
532538
(end_of_statement)
533539
(public_statement
534540
(assignment)
535541
(end_of_statement))
536542
(private_statement
537-
(operator)
543+
(operator
544+
(operator_name))
538545
(end_of_statement))
539546
(end_module_statement
540547
(end_of_statement))))
@@ -1076,7 +1083,8 @@ end program
10761083
(procedure_attribute)
10771084
(binding
10781085
(binding_name
1079-
(operator))
1086+
(operator
1087+
(operator_name)))
10801088
(method_name
10811089
(name)))
10821090
(end_of_statement))

test/corpus/expressions.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,7 @@ end program
10521052
(ERROR
10531053
(ERROR
10541054
(number_literal))
1055+
(user_defined_operator_name)
10551056
(number_literal))
10561057
(number_literal))))
10571058
(end_of_statement)

0 commit comments

Comments
 (0)