From 101b457260b3d6e9774139c06e155b9c9d154899 Mon Sep 17 00:00:00 2001 From: Jeff Avallone Date: Mon, 22 Dec 2014 12:44:19 -0500 Subject: [PATCH] Adding ordinal values to escapes Work still needs to be done to get control characters correct, and ordinals will need to be added for literals as well. This is in preparation for reporting incorrectly ordered charset ranges --- spec/parser/javascript/charset_escape_spec.js | 41 ++++++------- spec/parser/javascript/escape_spec.js | 61 +++++++++---------- src/js/parser/javascript/charset_escape.js | 2 +- src/js/parser/javascript/escape.js | 56 ++++++++--------- 4 files changed, 77 insertions(+), 83 deletions(-) diff --git a/spec/parser/javascript/charset_escape_spec.js b/spec/parser/javascript/charset_escape_spec.js index a5e3a1d..434eec7 100644 --- a/spec/parser/javascript/charset_escape_spec.js +++ b/spec/parser/javascript/charset_escape_spec.js @@ -5,30 +5,27 @@ import Snap from 'snapsvg'; describe('parser/javascript/charset_escape.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) => { + '\\b': { label: 'backspace', ordinal: 0x08 }, + '\\d': { label: 'digit', ordinal: -1 }, + '\\D': { label: 'non-digit', ordinal: -1 }, + '\\f': { label: 'form feed', ordinal: 0x0c }, + '\\n': { label: 'line feed', ordinal: 0x0a }, + '\\r': { label: 'carriage return', ordinal: 0x0d }, + '\\s': { label: 'white space', ordinal: -1 }, + '\\S': { label: 'non-white space', ordinal: -1 }, + '\\t': { label: 'tab', ordinal: 0x09 }, + '\\v': { label: 'vertical tab', ordinal: 0x0b }, + '\\w': { label: 'word', ordinal: -1 }, + '\\W': { label: 'non-word', ordinal: -1 }, + '\\0': { label: 'null', ordinal: 0 }, + '\\012': { label: 'octal: 12', ordinal: 10 }, + '\\cx': { label: 'ctrl-x', ordinal: -1 }, + '\\xab': { label: '0xAB', ordinal: 0xab }, + '\\uabcd': { label: 'U+ABCD', ordinal: 0xabcd } + }, (content, 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 - })); + expect(parser.__consume__charset_terminal()).toEqual(jasmine.objectContaining(content)); }); }); diff --git a/spec/parser/javascript/escape_spec.js b/spec/parser/javascript/escape_spec.js index a4c7d9d..d52dba0 100644 --- a/spec/parser/javascript/escape_spec.js +++ b/spec/parser/javascript/escape_spec.js @@ -5,40 +5,37 @@ import Snap from 'snapsvg'; describe('parser/javascript/escape.js', function() { _.forIn({ - '\\b': 'word boundary', - '\\B': 'non-word boundary', - '\\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', - '\\1': 'Back reference (group = 1)', - '\\2': 'Back reference (group = 2)', - '\\3': 'Back reference (group = 3)', - '\\4': 'Back reference (group = 4)', - '\\5': 'Back reference (group = 5)', - '\\6': 'Back reference (group = 6)', - '\\7': 'Back reference (group = 7)', - '\\8': 'Back reference (group = 8)', - '\\9': 'Back reference (group = 9)', - '\\012': 'octal: 12', - '\\cx': 'ctrl-x', - '\\xab': '0xAB', - '\\uabcd': 'U+ABCD' - }, (label, str) => { + '\\b': { label: 'word boundary', ordinal: -1 }, + '\\B': { label: 'non-word boundary', ordinal: -1 }, + '\\d': { label: 'digit', ordinal: -1 }, + '\\D': { label: 'non-digit', ordinal: -1 }, + '\\f': { label: 'form feed', ordinal: 0x0c }, + '\\n': { label: 'line feed', ordinal: 0x0a }, + '\\r': { label: 'carriage return', ordinal: 0x0d }, + '\\s': { label: 'white space', ordinal: -1 }, + '\\S': { label: 'non-white space', ordinal: -1 }, + '\\t': { label: 'tab', ordinal: 0x09 }, + '\\v': { label: 'vertical tab', ordinal: 0x0b }, + '\\w': { label: 'word', ordinal: -1 }, + '\\W': { label: 'non-word', ordinal: -1 }, + '\\0': { label: 'null', ordinal: 0 }, + '\\1': { label: 'Back reference (group = 1)', ordinal: -1 }, + '\\2': { label: 'Back reference (group = 2)', ordinal: -1 }, + '\\3': { label: 'Back reference (group = 3)', ordinal: -1 }, + '\\4': { label: 'Back reference (group = 4)', ordinal: -1 }, + '\\5': { label: 'Back reference (group = 5)', ordinal: -1 }, + '\\6': { label: 'Back reference (group = 6)', ordinal: -1 }, + '\\7': { label: 'Back reference (group = 7)', ordinal: -1 }, + '\\8': { label: 'Back reference (group = 8)', ordinal: -1 }, + '\\9': { label: 'Back reference (group = 9)', ordinal: -1 }, + '\\012': { label: 'octal: 12', ordinal: 10 }, + '\\cx': { label: 'ctrl-x', ordinal: -1 }, + '\\xab': { label: '0xAB', ordinal: 0xab }, + '\\uabcd': { label: 'U+ABCD', ordinal: 0xabcd } + }, (content, str) => { it(`parses "${str}" as an Escape`, function() { var parser = new javascript.Parser(str); - expect(parser.__consume__terminal()).toEqual(jasmine.objectContaining({ - type: 'escape', - label - })); + expect(parser.__consume__terminal()).toEqual(jasmine.objectContaining(content)); }); }); diff --git a/src/js/parser/javascript/charset_escape.js b/src/js/parser/javascript/charset_escape.js index 576f8c3..8690268 100644 --- a/src/js/parser/javascript/charset_escape.js +++ b/src/js/parser/javascript/charset_escape.js @@ -4,5 +4,5 @@ import Escape from './escape.js'; export default _.extend({}, Escape, { type: 'charset-escape', - b: 'backspace' + b: ['backspace', 0x08] }); diff --git a/src/js/parser/javascript/escape.js b/src/js/parser/javascript/escape.js index 6f74c5f..47a0340 100644 --- a/src/js/parser/javascript/escape.js +++ b/src/js/parser/javascript/escape.js @@ -16,46 +16,46 @@ export default { setup() { this.code = this.properties.esc.properties.code.textValue; this.arg = this.properties.esc.properties.arg.textValue; - this.label = _.result(this, this.code); + [this.label, this.ordinal] = _.result(this, this.code); }, // Escape code mappings - b: 'word boundary', - B: 'non-word boundary', - 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', - 1: 'Back reference (group = 1)', - 2: 'Back reference (group = 2)', - 3: 'Back reference (group = 3)', - 4: 'Back reference (group = 4)', - 5: 'Back reference (group = 5)', - 6: 'Back reference (group = 6)', - 7: 'Back reference (group = 7)', - 8: 'Back reference (group = 8)', - 9: 'Back reference (group = 9)', + b: ['word boundary', -1], + B: ['non-word boundary', -1], + d: ['digit', -1], + D: ['non-digit', -1], + f: ['form feed', 0x0c], + n: ['line feed', 0x0a], + r: ['carriage return', 0x0d], + s: ['white space', -1], + S: ['non-white space', -1], + t: ['tab', 0x09], + v: ['vertical tab', 0x0b], + w: ['word', -1], + W: ['non-word', -1], + 1: ['Back reference (group = 1)', -1], + 2: ['Back reference (group = 2)', -1], + 3: ['Back reference (group = 3)', -1], + 4: ['Back reference (group = 4)', -1], + 5: ['Back reference (group = 5)', -1], + 6: ['Back reference (group = 6)', -1], + 7: ['Back reference (group = 7)', -1], + 8: ['Back reference (group = 8)', -1], + 9: ['Back reference (group = 9)', -1], 0() { if (this.arg) { - return `octal: ${this.arg}`; + return [`octal: ${this.arg}`, parseInt(this.arg, 8)]; } else { - return 'null'; + return ['null', 0]; } }, c() { - return `ctrl-${this.arg}`; + return [`ctrl-${this.arg}`, -1]; }, x() { - return `0x${this.arg.toUpperCase()}`; + return [`0x${this.arg.toUpperCase()}`, parseInt(this.arg, 16)]; }, u() { - return `U+${this.arg.toUpperCase()}`; + return [`U+${this.arg.toUpperCase()}`, parseInt(this.arg, 16)]; } };