From ac8d90e65ab2197b0697d1d1a9fd345c02e36dcf Mon Sep 17 00:00:00 2001 From: LiHS Date: Thu, 15 Aug 2019 13:59:41 +0800 Subject: [PATCH] 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++}`; }