@@ -896,15 +896,9 @@ module.exports = grammar({
896896 option : ( _ ) => / @ ? [ A - Z a - z - _ \d] + / ,
897897
898898 hash_escape : ( _ ) => token . immediate ( prec ( 1 , / # [ # , } ] / ) ) ,
899+ hash_escape_no_comma : ( _ ) => token . immediate ( prec ( 1 , / # [ # } ] / ) ) ,
899900 _hash : ( _ ) => token . immediate ( prec ( 1 , / # [ ^ # , { } " ' H h D P T S F I W ] / ) ) ,
900901 hash_rgb : ( _ ) => token . immediate ( prec ( 1 , / # [ \d A - F a - f ] { 6 } / ) ) ,
901- _hash_rules : ( $ ) =>
902- choice (
903- $ . hash_escape ,
904- $ . _hash ,
905- $ . hash_rgb ,
906- token . immediate ( prec ( 1 , / # [ \d A - F a - f ] { 1 , 5 } / ) ) ,
907- ) ,
908902 backslash_escape : ( _ ) => BACKSLASH_ESCAPE ,
909903 backslash_escape_immediate : ( _ ) => token . immediate ( BACKSLASH_ESCAPE ) ,
910904 _expr_variable_name : ( _ ) => / @ ? [ A - Z a - z ] [ A - Z a - z - _ \d] + / ,
@@ -914,7 +908,7 @@ module.exports = grammar({
914908 operator : ( _ ) => / = = | ! = | < | > | < = | > = | \| \| | & & / ,
915909 attribute : ( _ ) => / [ a - z - ] + / ,
916910 _str_single_quotes_inner : ( $ ) =>
917- choice ( $ . expr_single_quotes , $ . _hash_rules , / ( [ ^ # ' ] ) + / ) ,
911+ choice ( $ . expr_single_quotes , hash_rules ( $ , true ) , / ( [ ^ # ' ] ) + / ) ,
918912 str_single_quotes : ( $ ) =>
919913 seq (
920914 "'" ,
@@ -931,7 +925,7 @@ module.exports = grammar({
931925 choice (
932926 $ . expr_double_quotes ,
933927 $ . backslash_escape ,
934- $ . _hash_rules ,
928+ hash_rules ( $ , true ) ,
935929 / ( [ ^ # " \\ ] | \\ \r ? \n ) + / ,
936930 ) ,
937931 str_double_quotes : ( $ ) => seq ( '"' , repeat ( $ . _str_double_quotes_inner ) , '"' ) ,
@@ -988,10 +982,6 @@ function sep1(rule, separator) {
988982 return seq ( rule , repeat ( seq ( separator , rule ) ) ) ;
989983}
990984
991- function commaSep1 ( rule ) {
992- return sep1 ( rule , "," ) ;
993- }
994-
995985function spaceSep1 ( $ , rule ) {
996986 return sep1 ( choice ( rule , $ . comment ) , token . immediate ( prec ( 1 , " " ) ) ) ;
997987}
@@ -1008,6 +998,15 @@ function cmdOpts(...args) {
1008998 return repeat ( choice ( ...args ) ) ;
1009999}
10101000
1001+ function hash_rules ( $ , comma ) {
1002+ return choice (
1003+ comma ? $ . hash_escape : $ . hash_escape_no_comma ,
1004+ $ . _hash ,
1005+ $ . hash_rgb ,
1006+ token . immediate ( prec ( 1 , / # [ \d A - F a - f ] { 1 , 5 } / ) ) ,
1007+ ) ;
1008+ }
1009+
10111010function exprRule ( $ , quote ) {
10121011 const expr = quote == '"' ? $ . expr_double_quotes : $ . expr_single_quotes ;
10131012 return choice (
@@ -1022,38 +1021,46 @@ function exprRule($, quote) {
10221021 seq ( alias ( $ . _expr_variable_name , $ . function_name ) , ":" ) ,
10231022 seq ( $ . operator , ":" ) ,
10241023 ) ,
1025- commaSep1 (
1024+ sep1 (
10261025 repeat (
10271026 choice (
10281027 expr ,
1029- $ . _hash_rules ,
1028+ hash_rules ( $ , false ) ,
10301029 token . immediate (
10311030 prec ( 1 , quote == '"' ? / [ ^ , } " # ] + / : / [ ^ , } ' # ] + / ) ,
10321031 ) ,
10331032 ) ,
10341033 ) ,
1034+ choice (
1035+ token . immediate ( prec ( 1 , "#," ) ) ,
1036+ token . immediate ( prec ( 1 , "," ) ) ,
1037+ ) ,
10351038 ) ,
10361039 ) ,
10371040 ) ,
10381041 "}" ,
10391042 ) ,
10401043 seq (
10411044 token . immediate ( prec ( 1 , "#[" ) ) ,
1042- commaSep1 (
1043- choice (
1045+ sep1 (
1046+ seq (
10441047 $ . attribute ,
1045- seq (
1046- $ . attribute ,
1047- "=" ,
1048- choice (
1049- expr ,
1050- $ . _hash_rules ,
1051- token . immediate (
1052- prec ( 1 , quote == '"' ? / [ ^ , \] " # ] + / : / [ ^ , \] ' # ] + / ) ,
1048+ optional (
1049+ seq (
1050+ "=" ,
1051+ repeat (
1052+ choice (
1053+ expr ,
1054+ hash_rules ( $ , false ) ,
1055+ token . immediate (
1056+ prec ( 1 , quote == '"' ? / [ ^ , \] " # ] + / : / [ ^ , \] ' # ] + / ) ,
1057+ ) ,
1058+ ) ,
10531059 ) ,
10541060 ) ,
10551061 ) ,
10561062 ) ,
1063+ choice ( token . immediate ( prec ( 1 , "#," ) ) , token . immediate ( prec ( 1 , "," ) ) ) ,
10571064 ) ,
10581065 "]" ,
10591066 ) ,
0 commit comments