diff --git a/grammar.js b/grammar.js index ffb193c..d4d6942 100644 --- a/grammar.js +++ b/grammar.js @@ -71,7 +71,7 @@ const PREC = { // # // NOTE: If we don't put comments at a negative rank, then `"#"` will treat the `#` as // the start of a comment rather than being part of the string. - COMMENT: { ASSOC: prec, RANK: -1}, + COMMENT: { ASSOC: prec, RANK: -1 }, // {, ( // NOTE: If we understand correctly, brace and parenthesis blocks are given the same @@ -237,8 +237,8 @@ module.exports = grammar({ // Top-level rules. // The zero width `$._start` ensures that `program` starts at `(0, 0)`. program: $ => seq( - $._start, - repeat(choice($._expression, $._semicolon, $._newline)) + $._start, + repeat(choice($._expression, $._semicolon, $._newline)) ), // Function definitions. @@ -730,7 +730,7 @@ module.exports = grammar({ ), // Comments. - comment: $ => token(withPrec(PREC.COMMENT, /#.*/)), + comment: $ => token(withPrec(PREC.COMMENT, seq('#', /[^\r\n]*/))), // Commas. We include these in the AST so we can figure out the // argument call position. This is necessary given how R tolerates diff --git a/src/grammar.json b/src/grammar.json index b3cb825..5fb3d51 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -2812,8 +2812,17 @@ "type": "PREC", "value": -1, "content": { - "type": "PATTERN", - "value": "#.*" + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "#" + }, + { + "type": "PATTERN", + "value": "[^\\r\\n]*" + } + ] } } }, diff --git a/src/parser.c b/src/parser.c index 9413479..7beca71 100644 --- a/src/parser.c +++ b/src/parser.c @@ -3685,18 +3685,18 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { END_STATE(); case 3: if (lookahead == '"') ADVANCE(73); - if (lookahead == '#') ADVANCE(77); + if (lookahead == '#') ADVANCE(78); if (lookahead == '\\') ADVANCE(8); if (('\t' <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(78); + lookahead == ' ') ADVANCE(77); if (lookahead != 0) ADVANCE(79); END_STATE(); case 4: - if (lookahead == '#') ADVANCE(74); + if (lookahead == '#') ADVANCE(75); if (lookahead == '\'') ADVANCE(72); if (lookahead == '\\') ADVANCE(8); if (('\t' <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(75); + lookahead == ' ') ADVANCE(74); if (lookahead != 0) ADVANCE(76); END_STATE(); case 5: @@ -4004,19 +4004,20 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { END_STATE(); case 74: ACCEPT_TOKEN(aux_sym__single_quoted_string_content_token1); - if (lookahead == '\n') ADVANCE(76); + if (lookahead == '#') ADVANCE(75); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(74); if (lookahead != 0 && lookahead != '\'' && - lookahead != '\\') ADVANCE(74); + lookahead != '\\') ADVANCE(76); END_STATE(); case 75: ACCEPT_TOKEN(aux_sym__single_quoted_string_content_token1); - if (lookahead == '#') ADVANCE(74); - if (('\t' <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(75); + if (lookahead == '\n' || + lookahead == '\r') ADVANCE(76); if (lookahead != 0 && lookahead != '\'' && - lookahead != '\\') ADVANCE(76); + lookahead != '\\') ADVANCE(75); END_STATE(); case 76: ACCEPT_TOKEN(aux_sym__single_quoted_string_content_token1); @@ -4026,20 +4027,21 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { END_STATE(); case 77: ACCEPT_TOKEN(aux_sym__double_quoted_string_content_token1); - if (lookahead == '\n') ADVANCE(79); + if (lookahead == '#') ADVANCE(78); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(77); if (lookahead != 0 && lookahead != '"' && - lookahead != '\\') ADVANCE(77); + lookahead != '#' && + lookahead != '\\') ADVANCE(79); END_STATE(); case 78: ACCEPT_TOKEN(aux_sym__double_quoted_string_content_token1); - if (lookahead == '#') ADVANCE(77); - if (('\t' <= lookahead && lookahead <= '\r') || - lookahead == ' ') ADVANCE(78); + if (lookahead == '\n' || + lookahead == '\r') ADVANCE(79); if (lookahead != 0 && lookahead != '"' && - lookahead != '#' && - lookahead != '\\') ADVANCE(79); + lookahead != '\\') ADVANCE(78); END_STATE(); case 79: ACCEPT_TOKEN(aux_sym__double_quoted_string_content_token1); @@ -4136,7 +4138,8 @@ static bool ts_lex(TSLexer *lexer, TSStateId state) { case 97: ACCEPT_TOKEN(sym_comment); if (lookahead != 0 && - lookahead != '\n') ADVANCE(97); + lookahead != '\n' && + lookahead != '\r') ADVANCE(97); END_STATE(); case 98: ACCEPT_TOKEN(sym_comma);