diff --git a/grammar.js b/grammar.js index a97fd9f..0426af2 100644 --- a/grammar.js +++ b/grammar.js @@ -165,10 +165,14 @@ module.exports = grammar({ character_literal: _ => token(seq( '\'', + // this accepts multiple characters while java doesn't + // hence multiple characters (even unicode ones) are allowed repeat1(choice( /[^\\'\n]/, /\\./, /\\\n/, + /\\u+005[cC]./, + /\\u+005[cC]\n/, )), '\'', )), @@ -213,12 +217,12 @@ module.exports = grammar({ prec(1, $.escape_sequence), ), escape_sequence: _ => token.immediate(seq( - '\\', + choice('\\', /\\u+005[cC]/), choice( /[^xu0-7]/, /[0-7]{1,3}/, /x[0-9a-fA-F]{2}/, - /u[0-9a-fA-F]{4}/, + /u+[0-9a-fA-F]{4}/, /u\{[0-9a-fA-F]+\}/, ))), diff --git a/test/corpus/literals.txt b/test/corpus/literals.txt index fe49e80..18940a0 100644 --- a/test/corpus/literals.txt +++ b/test/corpus/literals.txt @@ -125,6 +125,8 @@ character literals '\uFFFF'; '\177'; '™'; +'\u005cn'; +'\u005c''; --- @@ -137,6 +139,8 @@ character literals (expression_statement (character_literal)) (expression_statement (character_literal)) (expression_statement (character_literal)) + (expression_statement (character_literal)) + (expression_statement (character_literal)) (expression_statement (character_literal))) =============== @@ -147,6 +151,8 @@ string literals "\""; "This is a string"; "'"; +"\uuu0041"; +"\u005c""; --- @@ -161,7 +167,13 @@ string literals (string_fragment))) (expression_statement (string_literal - (string_fragment)))) + (string_fragment))) + (expression_statement + (string_literal + (escape_sequence))) + (expression_statement + (string_literal + (escape_sequence)))) =============== text block