From 1b21377c52e194039127646551e541cad0429aef Mon Sep 17 00:00:00 2001 From: Cory Kilger Date: Fri, 5 Jun 2015 22:36:22 -0600 Subject: [PATCH 1/2] Added Unicode category support. --- src/js/parser/javascript/escape.js | 22 ++++++++++++++++++++++ src/js/parser/javascript/grammar.peg | 10 +++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/js/parser/javascript/escape.js b/src/js/parser/javascript/escape.js index 783ac1a1..14910094 100644 --- a/src/js/parser/javascript/escape.js +++ b/src/js/parser/javascript/escape.js @@ -84,5 +84,27 @@ export default { }, u() { return [`U+${this.arg.toUpperCase()}`, parseInt(this.arg, 16), false]; + }, + p() { + var arg = this.arg; + var map = { + 'L': 'Letter', 'Ll': 'Lowercase_Letter', 'Lu': 'Uppercase_Letter', 'Lt': 'Titlecase_Letter', + 'L&': 'Cased_Letter', 'Lm': 'Modifier_Letter', 'Lo': 'Other_Letter', 'M': 'Mark', 'Mn': 'Non_Spacing_Mark', + 'Mc': 'Spacing_Combining_Mark', 'Me': 'Enclosing_Mark', 'Z': 'Separator', 'Zs': 'Space_Separator', + 'Zl': 'Line_Separator', 'Zp': 'Paragraph_Separator', 'S': 'Symbol', 'Sm': 'Math_Symbol', + 'Sc': 'Currency_Symbol', 'Sk': 'Modifier_Symbol', 'So': 'Other_Symbol', 'N': 'Number', + 'Nd': 'Decimal_Digit_Number', 'Nl': 'Letter_Number', 'No': 'Other_Number', 'P': 'Punctuation', + 'Pd': 'Dash_Punctuation', 'Ps': 'Open_Punctuation', 'Pe': 'Close_Punctuation', 'Pi': 'Initial_Punctuation', + 'Pf': 'Final_Punctuation', 'Pc': 'Connector_Punctuation', 'Po': 'Other_Punctuation', 'C': 'Other', + 'Cc': 'Control', 'Cf': 'Format', 'Co': 'Private_Use', 'Cs': 'Surrogate', 'Cn': 'Unassigned' + }; + var temp = map[arg]; + if (temp) { + arg = temp; + } + if (arg.slice(0, 2) == 'In') { + arg = 'in '+arg.slice(2); + } + return [arg.replace(/_/g, ' '), -1, false]; } }; diff --git a/src/js/parser/javascript/grammar.peg b/src/js/parser/javascript/grammar.peg index b05babec..36bbb1d6 100644 --- a/src/js/parser/javascript/grammar.peg +++ b/src/js/parser/javascript/grammar.peg @@ -25,14 +25,16 @@ grammar JavascriptRegexp / octal_escape / hex_escape / unicode_escape - / null_escape ) + / null_escape + / unicode_category_escape ) charset_range_escape <- "\\" esc:( code:[bfnrtv] arg:""? / control_escape / octal_escape / hex_escape / unicode_escape - / null_escape ) + / null_escape + / unicode_category_escape ) charset_literal <- ( ""? literal:[^\\\]] ) / ( literal:"\\" &"c" ) / ( "\\" literal:[^bdDfnrsStvwW] ) @@ -45,7 +47,8 @@ grammar JavascriptRegexp / octal_escape / hex_escape / unicode_escape - / null_escape ) + / null_escape + / unicode_category_escape ) literal <- ( ""? literal:[^|\\/.\[\(\)?+*$^] ) / ( literal:"\\" &"c" ) / ( "\\" literal:. ) @@ -55,3 +58,4 @@ grammar JavascriptRegexp hex_escape <- code:"x" arg:( [0-9a-fA-F] [0-9a-fA-F] ) unicode_escape <- code:"u" arg:( [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] ) null_escape <- code:"0" arg:""? + unicode_category_escape <- code:"p" "{" arg:([_0-9a-zA-Z-]+) "}" From e6741a0259bd6bf54b45fa910e8e75e7ff264d81 Mon Sep 17 00:00:00 2001 From: Cory Kilger Date: Fri, 5 Jun 2015 22:43:10 -0600 Subject: [PATCH 2/2] Added non-Unicode category support. --- src/js/parser/javascript/escape.js | 46 ++++++++++++++++------------ src/js/parser/javascript/grammar.peg | 10 ++++-- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/js/parser/javascript/escape.js b/src/js/parser/javascript/escape.js index 14910094..c9be3a59 100644 --- a/src/js/parser/javascript/escape.js +++ b/src/js/parser/javascript/escape.js @@ -14,6 +14,28 @@ function hex(value) { return `(0x${str})`; } +function unicodeProperty(arg) { + var map = { + 'L': 'Letter', 'Ll': 'Lowercase_Letter', 'Lu': 'Uppercase_Letter', 'Lt': 'Titlecase_Letter', + 'L&': 'Cased_Letter', 'Lm': 'Modifier_Letter', 'Lo': 'Other_Letter', 'M': 'Mark', 'Mn': 'Non_Spacing_Mark', + 'Mc': 'Spacing_Combining_Mark', 'Me': 'Enclosing_Mark', 'Z': 'Separator', 'Zs': 'Space_Separator', + 'Zl': 'Line_Separator', 'Zp': 'Paragraph_Separator', 'S': 'Symbol', 'Sm': 'Math_Symbol', + 'Sc': 'Currency_Symbol', 'Sk': 'Modifier_Symbol', 'So': 'Other_Symbol', 'N': 'Number', + 'Nd': 'Decimal_Digit_Number', 'Nl': 'Letter_Number', 'No': 'Other_Number', 'P': 'Punctuation', + 'Pd': 'Dash_Punctuation', 'Ps': 'Open_Punctuation', 'Pe': 'Close_Punctuation', 'Pi': 'Initial_Punctuation', + 'Pf': 'Final_Punctuation', 'Pc': 'Connector_Punctuation', 'Po': 'Other_Punctuation', 'C': 'Other', + 'Cc': 'Control', 'Cf': 'Format', 'Co': 'Private_Use', 'Cs': 'Surrogate', 'Cn': 'Unassigned' + }; + var temp = map[arg]; + if (temp) { + arg = temp; + } + if (arg.slice(0, 2) == 'In') { + arg = 'in '+arg.slice(2); + } + return arg.replace(/_/g, ' '); +} + export default { type: 'escape', @@ -86,25 +108,9 @@ export default { return [`U+${this.arg.toUpperCase()}`, parseInt(this.arg, 16), false]; }, p() { - var arg = this.arg; - var map = { - 'L': 'Letter', 'Ll': 'Lowercase_Letter', 'Lu': 'Uppercase_Letter', 'Lt': 'Titlecase_Letter', - 'L&': 'Cased_Letter', 'Lm': 'Modifier_Letter', 'Lo': 'Other_Letter', 'M': 'Mark', 'Mn': 'Non_Spacing_Mark', - 'Mc': 'Spacing_Combining_Mark', 'Me': 'Enclosing_Mark', 'Z': 'Separator', 'Zs': 'Space_Separator', - 'Zl': 'Line_Separator', 'Zp': 'Paragraph_Separator', 'S': 'Symbol', 'Sm': 'Math_Symbol', - 'Sc': 'Currency_Symbol', 'Sk': 'Modifier_Symbol', 'So': 'Other_Symbol', 'N': 'Number', - 'Nd': 'Decimal_Digit_Number', 'Nl': 'Letter_Number', 'No': 'Other_Number', 'P': 'Punctuation', - 'Pd': 'Dash_Punctuation', 'Ps': 'Open_Punctuation', 'Pe': 'Close_Punctuation', 'Pi': 'Initial_Punctuation', - 'Pf': 'Final_Punctuation', 'Pc': 'Connector_Punctuation', 'Po': 'Other_Punctuation', 'C': 'Other', - 'Cc': 'Control', 'Cf': 'Format', 'Co': 'Private_Use', 'Cs': 'Surrogate', 'Cn': 'Unassigned' - }; - var temp = map[arg]; - if (temp) { - arg = temp; - } - if (arg.slice(0, 2) == 'In') { - arg = 'in '+arg.slice(2); - } - return [arg.replace(/_/g, ' '), -1, false]; + return [unicodeProperty(this.arg), -1, false]; + }, + P() { + return ['non-'+unicodeProperty(this.arg), -1, false]; } }; diff --git a/src/js/parser/javascript/grammar.peg b/src/js/parser/javascript/grammar.peg index 36bbb1d6..cd63ba5a 100644 --- a/src/js/parser/javascript/grammar.peg +++ b/src/js/parser/javascript/grammar.peg @@ -26,7 +26,8 @@ grammar JavascriptRegexp / hex_escape / unicode_escape / null_escape - / unicode_category_escape ) + / unicode_category_escape + / non_unicode_category_escape ) charset_range_escape <- "\\" esc:( code:[bfnrtv] arg:""? / control_escape @@ -34,7 +35,8 @@ grammar JavascriptRegexp / hex_escape / unicode_escape / null_escape - / unicode_category_escape ) + / unicode_category_escape + / non_unicode_category_escape ) charset_literal <- ( ""? literal:[^\\\]] ) / ( literal:"\\" &"c" ) / ( "\\" literal:[^bdDfnrsStvwW] ) @@ -48,7 +50,8 @@ grammar JavascriptRegexp / hex_escape / unicode_escape / null_escape - / unicode_category_escape ) + / unicode_category_escape + / non_unicode_category_escape ) literal <- ( ""? literal:[^|\\/.\[\(\)?+*$^] ) / ( literal:"\\" &"c" ) / ( "\\" literal:. ) @@ -59,3 +62,4 @@ grammar JavascriptRegexp unicode_escape <- code:"u" arg:( [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] ) null_escape <- code:"0" arg:""? unicode_category_escape <- code:"p" "{" arg:([_0-9a-zA-Z-]+) "}" + non_unicode_category_escape <- code:"P" "{" arg:([_0-9a-zA-Z-]+) "}"