diff --git a/spec/parser/javascript/charset_escape_spec.js b/spec/parser/javascript/charset_escape_spec.js new file mode 100644 index 0000000..e168a13 --- /dev/null +++ b/spec/parser/javascript/charset_escape_spec.js @@ -0,0 +1,35 @@ +import javascript from 'src/js/parser/javascript/parser.js'; +import _ from 'lodash'; +import Snap from 'snapsvg'; + +describe('parser/javascript/any_character.js', function() { + + _.forIn({ + '\\b': 'backspace', + '\\d': 'digit', + '\\D': 'non-digit', + '\\f': 'form feed', + '\\n': 'line feed', + '\\r': 'carriage return', + '\\s': 'white space', + '\\S': 'non-white space', + '\\t': 'tab', + '\\v': 'vertical tab', + '\\w': 'word', + '\\W': 'non-word', + '\\0': 'null', + '\\012': 'octal: 12', + '\\cx': 'ctrl-x', + '\\xab': '0xAB', + '\\uabcd': 'U+ABCD' + }, (label, str) => { + it(`parses "${str}" as a CharsetEscape`, function() { + var parser = new javascript.Parser(str); + expect(parser.__consume__charset_terminal()).toEqual(jasmine.objectContaining({ + type: 'charset-escape', + label + })); + }); + }); + +}); diff --git a/src/js/parser/javascript/grammar.peg b/src/js/parser/javascript/grammar.peg index 67096e6..b77ece4 100644 --- a/src/js/parser/javascript/grammar.peg +++ b/src/js/parser/javascript/grammar.peg @@ -22,9 +22,11 @@ grammar JavascriptRegexp / charset_literal charset_escape <- "\\" esc:( code:[bdDfnrsStvwW] arg:""? + / code:"c" arg:. / code:"0" arg:[0-7]+ / code:"x" arg:( [0-9a-fA-F] [0-9a-fA-F] ) - / code:"u" arg:( [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] ) ) + / code:"u" arg:( [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] ) + / code:"0" arg:""? ) charset_literal <- ( ""? literal:[^\\\]] ) / ( "\\" literal:. ) terminal <- "." / escape