From ac8d90e65ab2197b0697d1d1a9fd345c02e36dcf Mon Sep 17 00:00:00 2001 From: LiHS Date: Thu, 15 Aug 2019 13:59:41 +0800 Subject: [PATCH 1/3] Adding named group capture --- spec/parser/javascript/subexp_spec.js | 7 +++++++ src/js/parser/javascript/grammar.peg | 5 ++++- src/js/parser/javascript/subexp.js | 4 ++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/spec/parser/javascript/subexp_spec.js b/spec/parser/javascript/subexp_spec.js index cd55938..1dcaa4f 100644 --- a/spec/parser/javascript/subexp_spec.js +++ b/spec/parser/javascript/subexp_spec.js @@ -13,6 +13,9 @@ describe('parser/javascript/subexp.js', function() { '(test)': { regexp: jasmine.objectContaining({ textValue: 'test' }) }, + '(?test)': { + regexp: jasmine.objectContaining({ textValue: 'test' }) + }, '(?=test)': { regexp: jasmine.objectContaining({ textValue: 'test' }) }, @@ -95,6 +98,10 @@ describe('parser/javascript/subexp.js', function() { label: 'group #1', groupCounter: 2 }, + '(?test)': { + label: 'group \'name\'', + groupCounter: 1 + }, '(?=test)': { label: 'positive lookahead', groupCounter: 1 diff --git a/src/js/parser/javascript/grammar.peg b/src/js/parser/javascript/grammar.peg index cdc84c7..d4bd29c 100644 --- a/src/js/parser/javascript/grammar.peg +++ b/src/js/parser/javascript/grammar.peg @@ -11,7 +11,10 @@ grammar JavascriptRegexp repeat_spec <- ( "{" min:[0-9]+ "," max:[0-9]+ "}" / "{" min:[0-9]+ ",}" / "{" exact:[0-9]+ "}" ) - subexp <- "(" capture:( "?:" / "?=" / "?!" )? regexp ")" + subexp <- "(" capture:( "?<" groupname:name ">" / "?:" / "?=" / "?!" )? regexp ")" + name <- alpha (alpha / numeric)* + alpha <- [a-zA-Z] + numeric <- [0-9] charset <- "[" invert:"^"? parts:( charset_range / charset_terminal )* "]" charset_range <- first:charset_range_terminal "-" last:charset_range_terminal charset_terminal <- charset_escape diff --git a/src/js/parser/javascript/subexp.js b/src/js/parser/javascript/subexp.js index 9f97811..ad819a5 100644 --- a/src/js/parser/javascript/subexp.js +++ b/src/js/parser/javascript/subexp.js @@ -48,6 +48,10 @@ export default { label() { if (_.has(this.labelMap, this.properties.capture.textValue)) { return this.labelMap[this.properties.capture.textValue]; + } else if (this.properties.capture !== undefined + && this.properties.capture.properties !== undefined + && this.properties.capture.properties.groupname) { + return `group '${this.properties.capture.properties.groupname.textValue}'`; } else { return `group #${this.state.groupCounter++}`; } From c092b5fa3a6431b8e609e1f05867f364d1756fff Mon Sep 17 00:00:00 2001 From: LiHS Date: Thu, 15 Aug 2019 14:02:53 +0800 Subject: [PATCH 2/3] Adding lookbehind assertion --- spec/parser/javascript/subexp_spec.js | 14 ++++++++++++++ src/js/parser/javascript/grammar.peg | 2 +- src/js/parser/javascript/subexp.js | 4 +++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/spec/parser/javascript/subexp_spec.js b/spec/parser/javascript/subexp_spec.js index 1dcaa4f..cabaabe 100644 --- a/spec/parser/javascript/subexp_spec.js +++ b/spec/parser/javascript/subexp_spec.js @@ -22,6 +22,12 @@ describe('parser/javascript/subexp.js', function() { '(?!test)': { regexp: jasmine.objectContaining({ textValue: 'test' }) }, + '(?<=test)': { + regexp: jasmine.objectContaining({ textValue: 'test' }) + }, + '(? - subexp <- "(" capture:( "?<" groupname:name ">" / "?:" / "?=" / "?!" )? regexp ")" + subexp <- "(" capture:( "?<" groupname:name ">" / "?:" / "?=" / "?!" / "?<=" / "? name <- alpha (alpha / numeric)* alpha <- [a-zA-Z] numeric <- [0-9] diff --git a/src/js/parser/javascript/subexp.js b/src/js/parser/javascript/subexp.js index ad819a5..ccb410e 100644 --- a/src/js/parser/javascript/subexp.js +++ b/src/js/parser/javascript/subexp.js @@ -26,7 +26,9 @@ export default { labelMap: { '?:': '', '?=': 'positive lookahead', - '?!': 'negative lookahead' + '?!': 'negative lookahead', + '?<=': 'positive lookbehind', + '? Date: Thu, 15 Aug 2019 14:03:48 +0800 Subject: [PATCH 3/3] Fixing some eslint warning --- spec/parser/javascript/subexp_spec.js | 2 +- src/js/parser/javascript/subexp.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/parser/javascript/subexp_spec.js b/spec/parser/javascript/subexp_spec.js index cabaabe..3ae6194 100644 --- a/spec/parser/javascript/subexp_spec.js +++ b/spec/parser/javascript/subexp_spec.js @@ -75,7 +75,7 @@ describe('parser/javascript/subexp.js', function() { this.node = new javascript.Parser('(test)').__consume__subexp(); this.node.regexp = jasmine.createSpyObj('regexp', ['render']); this.node.container = jasmine.createSpyObj('container', ['addClass', 'group']); - spyOn(this.node, 'label').and.returnValue('example label') + spyOn(this.node, 'label').and.returnValue('example label'); this.node.regexp.render.and.returnValue(this.renderDeferred.promise); }); diff --git a/src/js/parser/javascript/subexp.js b/src/js/parser/javascript/subexp.js index ccb410e..b91f857 100644 --- a/src/js/parser/javascript/subexp.js +++ b/src/js/parser/javascript/subexp.js @@ -65,7 +65,7 @@ export default { this.regexp = this.properties.regexp; // If there is no need for a label, then proxy to the nested regexp. - if (this.properties.capture.textValue == '?:') { + if (this.properties.capture.textValue === '?:') { this.proxy = this.regexp; } }