@@ -271,7 +271,7 @@ module.exports = grammar({
271
271
commaSep1 ( $ . implicit_range ) ,
272
272
')'
273
273
) ) ,
274
- alias ( caseInsensitive ( 'none' ) , $ . none )
274
+ alias ( caseInsensitive ( 'none' , aliasAsWord = false ) , $ . none )
275
275
)
276
276
) ,
277
277
@@ -409,9 +409,9 @@ module.exports = grammar({
409
409
caseInsensitive ( 'byte' ) ,
410
410
caseInsensitive ( 'integer' ) ,
411
411
caseInsensitive ( 'real' ) ,
412
- caseInsensitive ( 'double[ \t]* precision' ) ,
412
+ whiteSpacedKeyword ( 'double' , ' precision') ,
413
413
caseInsensitive ( 'complex' ) ,
414
- caseInsensitive ( 'double[ \t]* complex' ) ,
414
+ whiteSpacedKeyword ( 'double' , ' complex') ,
415
415
caseInsensitive ( 'logical' ) ,
416
416
caseInsensitive ( 'character' )
417
417
) ,
@@ -444,7 +444,7 @@ module.exports = grammar({
444
444
choice (
445
445
caseInsensitive ( 'in' ) ,
446
446
caseInsensitive ( 'out' ) ,
447
- caseInsensitive ( 'in[ \t]* out' )
447
+ whiteSpacedKeyword ( 'in' , ' out')
448
448
) ,
449
449
')'
450
450
) ,
@@ -558,7 +558,7 @@ module.exports = grammar({
558
558
caseInsensitive ( 'continue' ) ,
559
559
seq ( caseInsensitive ( 'cycle' ) , optional ( $ . identifier ) ) ,
560
560
seq ( caseInsensitive ( 'exit' ) , optional ( $ . identifier ) ) ,
561
- seq ( caseInsensitive ( 'go[ \t]* to' ) , $ . statement_label ) ,
561
+ seq ( whiteSpacedKeyword ( 'go' , ' to') , $ . statement_label ) ,
562
562
caseInsensitive ( 'return' ) ,
563
563
seq ( caseInsensitive ( 'stop' ) , optional ( $ . _expression ) )
564
564
) ,
@@ -578,7 +578,7 @@ module.exports = grammar({
578
578
) ,
579
579
580
580
end_do_loop_statement : $ => seq (
581
- caseInsensitive ( 'end[ \t]* do' ) ,
581
+ whiteSpacedKeyword ( 'end' , ' do') ,
582
582
optional ( $ . _block_label )
583
583
) ,
584
584
@@ -610,12 +610,12 @@ module.exports = grammar({
610
610
) ,
611
611
612
612
end_if_statement : $ => seq (
613
- caseInsensitive ( 'end[ \t]* if' ) ,
613
+ whiteSpacedKeyword ( 'end' , ' if') ,
614
614
optional ( $ . _block_label )
615
615
) ,
616
616
617
617
elseif_clause : $ => seq (
618
- caseInsensitive ( 'else[ \t]* if' ) ,
618
+ whiteSpacedKeyword ( 'else' , ' if') ,
619
619
$ . parenthesized_expression ,
620
620
caseInsensitive ( 'then' ) ,
621
621
optional ( $ . _block_label ) ,
@@ -652,12 +652,12 @@ module.exports = grammar({
652
652
) ,
653
653
654
654
end_where_statement : $ => seq (
655
- caseInsensitive ( 'end[ \t]* where' ) ,
655
+ whiteSpacedKeyword ( 'end' , ' where') ,
656
656
optional ( $ . _block_label )
657
657
) ,
658
658
659
659
elsewhere_clause : $ => seq (
660
- caseInsensitive ( 'else[ \t]* where' ) ,
660
+ whiteSpacedKeyword ( 'else' , ' where') ,
661
661
optional ( $ . parenthesized_expression ) ,
662
662
optional ( $ . _block_label ) ,
663
663
$ . _end_of_statement ,
@@ -703,21 +703,21 @@ module.exports = grammar({
703
703
) ,
704
704
705
705
end_forall_statement : $ => seq (
706
- caseInsensitive ( 'end[ \t]* forall' ) ,
706
+ whiteSpacedKeyword ( 'end' , ' forall') ,
707
707
optional ( $ . _block_label )
708
708
) ,
709
709
710
710
select_case_statement : $ => seq (
711
711
optional ( $ . block_label_start_expression ) ,
712
- caseInsensitive ( 'select[ \t]* case' ) ,
712
+ whiteSpacedKeyword ( 'select' , ' case') ,
713
713
$ . selector ,
714
714
$ . _end_of_statement ,
715
715
repeat1 ( $ . case_statement ) ,
716
716
$ . end_select_case_statement
717
717
) ,
718
718
719
719
end_select_case_statement : $ => seq (
720
- caseInsensitive ( 'end[ \t]* select' ) ,
720
+ whiteSpacedKeyword ( 'end' , ' select') ,
721
721
optional ( $ . _block_label )
722
722
) ,
723
723
@@ -821,7 +821,7 @@ module.exports = grammar({
821
821
822
822
explicit_enumerator : $ => seq ( $ . identifier , '=' , $ . number_literal ) ,
823
823
824
- end_enum_statement : $ => caseInsensitive ( 'end[ \t]* enum' ) ,
824
+ end_enum_statement : $ => whiteSpacedKeyword ( 'end' , ' enum') ,
825
825
826
826
// precedence is used to override a conflict with the complex literal
827
827
unit_identifier : $ => prec ( 1 , choice (
@@ -1065,12 +1065,21 @@ module.exports = grammar({
1065
1065
1066
1066
module . exports . PREC = PREC
1067
1067
1068
- function caseInsensitive ( keyword ) {
1069
- return new RegExp ( keyword
1068
+ function caseInsensitive ( keyword , aliasAsWord = true ) {
1069
+ let result = new RegExp ( keyword
1070
1070
. split ( '' )
1071
1071
. map ( l => l !== l . toUpperCase ( ) ? `[${ l } ${ l . toUpperCase ( ) } ]` : l )
1072
1072
. join ( '' )
1073
1073
)
1074
+ if ( aliasAsWord ) result = alias ( result , keyword )
1075
+ return result
1076
+ }
1077
+
1078
+ function whiteSpacedKeyword ( prefix , suffix ) {
1079
+ return alias ( choice (
1080
+ seq ( caseInsensitive ( prefix , aliasAsWord = false ) , caseInsensitive ( suffix , aliasAsWord = false ) ) ,
1081
+ caseInsensitive ( prefix + suffix , aliasAsWord = false ) ) ,
1082
+ prefix + suffix )
1074
1083
}
1075
1084
1076
1085
/* TODO
@@ -1091,15 +1100,17 @@ function sep1 (rule, separator) {
1091
1100
return seq ( rule , repeat ( seq ( separator , rule ) ) )
1092
1101
}
1093
1102
1103
+ // This can be merged with whiteSpacedKeyword, keeping for now.
1094
1104
function blockStructureEnding ( $ , structType ) {
1095
1105
const obj = prec . right ( seq (
1096
- caseInsensitive ( 'end' ) ,
1097
- optional ( seq (
1098
- caseInsensitive ( structType ) ,
1099
- optional ( $ . identifier )
1100
- ) ) ,
1106
+ alias ( choice (
1107
+ seq (
1108
+ caseInsensitive ( 'end' , aliasAsWord = false ) ,
1109
+ optional ( caseInsensitive ( structType , aliasAsWord = false ) ) ) ,
1110
+ caseInsensitive ( 'end' + structType , aliasAsWord = false ) ) ,
1111
+ 'end' + structType ) ,
1112
+ optional ( $ . identifier ) ,
1101
1113
$ . _end_of_statement
1102
1114
) )
1103
- //
1104
1115
return obj
1105
1116
}
0 commit comments