JavaScript๋ ์ฌ์ฉ์ ์ ์ ์์ฉ๊ตฌ ๊ฐ ์์ผ๋ฉด BMP ์ธ๋ถ์ ์ ๋์ฝ๋ ๋ฌธ์/์ฝ๋ํฌ์ธํธ, ์ฆ ์ธ์ฝ๋ฉ์ 16๋นํธ ์ด์์ด ํ์ํ ์ ๋์ฝ๋ ๋ฌธ์/์ฝ๋ํฌ์ธํธ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ด ์ ํ์ ์๋ ์์ ๊ฐ์ด PEG.js์๋ ์ ์ฉ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํนํ [\u1D400-\u1D419]
(ํ์ฌ [แต0-แต9]
) ๋๋ ์ด์ ์์ํ๋ [๐-๐]
("์๋ชป๋ ๋ฌธ์ ๋ฒ์" ๋ฐ์)์ ๊ฐ์ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค [แต0-แต9]
์ค๋ฅ). (๊ทธ๋ฆฌ๊ณ ์๋ก์ด ES6 ํ๊ธฐ๋ฒ [\u{1D400}-\u{1D419}]
ํ๋ฉด SyntaxError: Expected "!", "$", "&", "(", ".", character class, comment, end of line, identifier, literal, or whitespace but "[" found.
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.)
PEG.js๋ฅผ ๋ณ๊ฒฝํ ํ์ ์์ด ์ด ์์ ์ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์์ ์ฝ๋:
์ด ๋ฌธ๋ฒ:
//MathUpper = [๐-๐]+
MathUpperEscaped = [\u1D400-\u1D419]+
์์๋๋ ๋์:
์ง์ ๋ ๋ฌธ๋ฒ์์ ์์ฑ๋ ํ์๋ "๐๐๐"์ ๊ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
์ค์ ํ๋:
๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ: Line 1, column 1: Expected [แต0-แต9] but "
(๋๋ ๋ค๋ฅธ ๊ท์น์ ์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ์ ๊ฑฐํ ๋ "์๋ชป๋ ๋ฌธ์ ๋ฒ์" ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.)
์์งํ ๋งํด์, PEG.js ๋ฌธ๋ฒ ํ์ ์ JavaScript ์์ ์ ๋ํ ์ ๋์ฝ๋ ์ง์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ธํ๊ณ ์ ๋ ์ ๋์ฝ๋์ ๋ํ ์ง์์ด ๊ฑฐ์ ๋๋ ์ ํ ์๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค(๋ ๋ฌธ๋ฒ ๋ชจ๋์ ๋ช ํํ๊ฒ ๋ช ์๋์ด ์์ต๋๋ค. _Non -BMP ๋ฌธ์๋ ์์ ํ ๋ฌด์๋ฉ๋๋ค_).
์ง๊ธ์ ๋ ๊ธด๊ธํ ๊ฐ์ธ ๋ฐ ์ ๋ฌด ๊ด๋ จ ํ๋ก์ ํธ(_PEG.js 0.x_ ํฌํจ)๋ฅผ ์งํํ๋ ๋์ ์ ๋์ฝ๋๋ฅผ ๋ ์ ์ดํดํ๋ ์ฌ๋์ด PR์ ์ ๊ณตํ๊ฑฐ๋ ๊ฒฐ๊ตญ _PEG ์ดํ์ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ๊ณ์ ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค. js v1_, ์ฃ์กํฉ๋๋ค.
์ฐธ๊ณ ๋ก ๋๋ฆฌ ์์ด ์๋ํ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๋ฌธ๋ฒ
start = result:[\uD83D\uDCA9]+ {return result.join('')}
u+1F4A9์ธ ๐ฉ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค. result.join('') ์ ์๋ก๊ฒ์ดํธ ์์ ๋ค์ ๊ฒฐํฉํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด hankey ๋์ ['\uD83D','\uDCA9']
๋ฅผ ์ป์ต๋๋ค. ๋ฒ์๊ฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
๋๋ฆฌ ์์ ๋ํ ์ถ๊ฐ ์ ๋ณด: https://en.wikipedia.org/wiki/UTF-16#U +010000_to_U+10FFFF
์ด๊ฒ์ OP๊ฐ ์์ฒญํ ๊ฒ์ ๊ฒฐ์ฝ ๋์ฒดํ์ง ์์ต๋๋ค.
@drewnolan ์๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
๋ถํํ๋ ๊ทธ ๋ฌธ๋ฒ์ \uD83D\uD83D
๋ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
์ด ๋ฌธ์ ์ ์ง๋ฉดํ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ํด: ์ ๋ ์ด์ด ์ข๊ฒ๋ BMP ์ธ๋ถ์ ์๋ ์ฝ๋ํฌ์ธํธ์ ์์ ๋ถ๋ถ์งํฉ๋ง ์ฒ๋ฆฌํ๋ฉด ๋๋ฏ๋ก ๊ฒฐ๊ตญ ๋์ค์ ์ด ๋งคํ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ๋ฐ์ ํ๊ธฐ ์ ์ BMP์ ๊ฐ์ธ ์ฌ์ฉ ์์ญ ์ ๋งคํํ๊ฒ ๋์์ต๋๋ค. .
์ด ์๋ฃจ์ ์ ๋ถ๋ช ํ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋ฌธ์ ๋ก ๊ฐ๋ ์ฐจ ์์ง๋ง ๋ด ๋ฌธ์ ์์ญ์์๋ ์ ์๋ํฉ๋๋ค.
@futagoza - ์ต์ ์ ๋คํด ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค.
utf-16
, ucs4
๋ฑ๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค. ์ด๋ ์๋ํ ๋ฐ์ดํฐ์ธ codepoints
๋ฅผ ๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉํ๋ ๋ฐฉ์์
๋๋ค. ์๋ฅผ ๋ค์ด utf-16-le
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ถ๋ถ์ ๋ฌธ์๋ฅผ code units
๋ผ๋ 2๋ฐ์ดํธ ์์ผ๋ก ์ธ์ฝ๋ฉํ ์ ์์ง๋ง ์ฝ๋ ๋จ์ ๊ทธ๋ฃน์ ์ฌ์ฉํ์ฌ ์ต๋ 0x10ffff
๊น์ง ๊ฐ์ด ๋์ ๋ฌธ์๋ฅผ ํํํ ์ ์์ต๋๋ค.๋๋ ์ด๊ฑฐ ํ๊ณ ์ถ์๋ฐ ํ์ค์ ์ผ๋ก ์๋ ๋ฏ
์ ์ฅ, ๋๊ตฐ๊ฐ๊ฐ ๊ฑฐ์ 1๋ ์ ์ ์ ์ฒด ๋ฌธ์์ด ํ์ ๊ต์ฒด๋ฅผ ์ปค๋ฐ ํ๊ณ ์ค๋ฒํค๋๋ฅผ ์ธ์ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ํ์ค JS ๋ฌธ์์ด์ ์ฌ์ฉํ๋๋ก ํ์ต๋๋ค.
๋ณํฉ๋์ง ์์ ์ด์
@StoneCypher ๋๋ ๋น์ ์ ๋ง์์์ ๋ถ์ ์ฌ๋ํฉ๋๋ค! ํ์ง๋ง ์ ํ์ฌ ์ ์ง ๊ด๋ฆฌ์๋ฅผ ํ๋ค๊ฒ ํฉ๋๊น? ์๋ฌด๋ ๋น์ง ๊ฒ์ด ์์ต๋๋ค. ์์ ์ ํฌํฌ๋ฅผ ์ ์ง ๊ด๋ฆฌํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
ํ์ฌ ์ ์ง ๋ณด์๊ฐ ์์ต๋๋ค. PEG๋ฅผ ์ธ์ํ ์ฌ๋์ ์๋ฌด ๊ฒ๋ ๊ณต๊ฐํ์ง ์์์ต๋๋ค. ๊ทธ๋ ๋ชจ๋ ๋์ง๊ณ , ๊ทธ ๋ค์ 3 ๋
๋์ ๋ง์ด๋์์ ์ผํ ๊ทธ๋ ๊ทธ ๋ชจ์ต์ฒ๋ผํ์ง ์์๋ค peg.js
ํธํ๋์ง ์๋๋ก, ๋ฉ๋ฆฌ, ๊ทธ๊ฐ ๋ค๋ฅธ ์ธ์ด๋ก ์ฒ์๋ถํฐ ์ด ์ผ๋ถํฐ ์์ AST.
์ด ๋๊ตฌ๋ es6 ๋ชจ๋ ์ง์, ํ์ดํ์คํฌ๋ฆฝํธ ์ง์, ํ์ดํ ์ง์, ํ์ฅ๋ ์ ๋์ฝ๋ ๋ฑ๊ณผ ๊ฐ์ด ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ฑํ ํ ์ค ์์ ์ฌํญ์ ์ปค๋ฐํ๊ธฐ ์ํด 3๋ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์ ๋ฐ์ ์์์ต๋๋ค.
๊ทธ์๊ฒ ๋ณํฉ์ ์์ฒญํ๋ ์์ญ ๋ช ์ ์ฌ๋๋ค์ด ์๊ณ ๊ทธ๋ ๊ณ์ "์๋์, ์ด๊ฒ์ ์ด์ ๋ด ์ทจ๋ฏธ ํ๋ก์ ํธ์ด๊ณ ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง ์ข์ํ์ง ์์ต๋๋ค"๋ผ๊ณ ๊ณ์ ๋งํฉ๋๋ค.
๋ง์ ์ฌ๋๋ค์ด ์ด ํ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ์ฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์ ํ ๋งํ์ด.
์ด ์ฌ๋์ ๋งค์ฐ ์ค์ํ ๋๊ตฌ์ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์ฝ์ํ๊ณ ์ ์ง ๊ด๋ฆฌ๋ฅผ ํ ๋ฒ๋ ํ์ง ์์์ต๋๋ค. ์ด์ ๋ค๋ฅธ ์ฌ๋์ด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํธํ ์ํ๋ก ์ ์งํ๋๋ก ํ ๋์ ๋๋ค.
์์ ์ ํฌํฌ๋ฅผ ์ ์ง ๊ด๋ฆฌํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋๋ ์ด์ 3 ๋
๋์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ด peg
๋ฌธ์ ์ถ์ ๊ธฐ์ ๊ฑฐ์ 1/3์ด ์์ ๋์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ณต์ ํ๊ณ , ์ด๋ฆ์ ๋ฐ๊พธ๊ณ , ์ปค๋ฐ์ ์๋ํ๊ธฐ ์ํด ํฌ๊ธฐ ๋ฌธ์ ๋ฅผ ์์ ํ๊ธฐ ์ํด ์ ํฌํฌ๋ฅผ ๋ง๋ค์ด์ผ ํ์ต๋๋ค. ์๋ํ๋ฉด ๊ด์ฐ์ด ๋๋ฌด ๋ง์ด ํ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
2017๋ ์ดํ๋ก ์ถ์ ๊ธฐ์ ์์ ์์๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์ด ์ด๋ฌํ ์์ ์ฌํญ์ ๋ฐ์ ๋์ ๋๋ค.
์ด ์ฌ๋์ ๋ง๋์ ์ ์งํ์ง ์์ต๋๋ค. ๊ทธ๋ ์ฃฝ๊ฒ ๋ด๋ฒ๋ ค ๋ก๋๋ค.
๋ณํ์ ์๊ฐ์ ๋๋ค.
@drewnolan- ๊ทธ๋์ ์ด๊ฒ์ด ํฅ๋ฏธ๋ก์ด์ง ์๋์ง ํ์คํ์ง ์์ง๋ง ๋๋ฆฌ ์์ ์ค์ ๋ก ์๋ํ์ง ์์ต๋๋ค. ๊ทธ์ ์ฐ์ฐ์ ์ผ์น๋ก ๋ณดํต ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ๋ฟ์ ๋๋ค.
๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ค๋ฉด ํํ ์์ค์ด ์๋ ์ธ์ฝ๋ฉ ์์ค ๋นํธ ํจํด์ ๋ํด ์๊ฐํด์ผ ํฉ๋๋ค.
์ฆ, ์ ๋์ฝ๋ ๊ฐ์ด 240์ด๋ฉด ๋๋ถ๋ถ์ ์ฌ๋๋ค์ "์ค, ๊ทธ๋ 0b1111 0000
ํฉ๋๋ค."๋ผ๊ณ ์๊ฐํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ์ ๋์ฝ๋๊ฐ 240์ ๋ํ๋ด๋ ๋ฐฉ์์ด ์๋๋๋ค. 127 ์ด์์ 2๋ฐ์ดํธ๋ก ํํ๋๋๋ฐ, ์์ ๋นํธ๊ฐ ๊ฐ ๋นํธ๊ฐ ์๋๋ผ ํ๋๊ทธ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ ์ ๋์ฝ๋์ 240์ ์ค์ ๋ก ์ ์ฅ์์ 0b0000 0001 0111 0000
์
๋๋ค(์ค์ ์ด๊ณ ์คํ๊ฐ ์๋ utf-7 ์ ์ธ, ์ํฉ์ด ๋งค์ฐ ์ด์ํด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, Wikipedia์์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ๋งํฉ๋๋ค. Wikipedia๊ฐ ์๋ชป๋์์ต๋๋ค. . SMS๊ฐ ์ ์ก๋๋ ๋ฐฉ์์ผ๋ก ์ ์ฒด ํธ๋ํฝ์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ธ์ฝ๋ฉ์ผ ์ ์์ต๋๋ค.)
์ฌ๊ธฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
STUV WXYZ ๋ฐ์ดํธ๋ฅผ ์์ฑํ ๋ค์ ucs4 ๋ฐ์ดํฐ์์ utf16์ ์์ฑํ๋ ๊ฒฝ์ฐ ํญ๋ชฉ์ด ๋ฐ์ผ๋ก ์๋ฆฌ๋ฉด ๊ฝค ์์ฃผ ๋ค์ ํจ๊ป ์คํ ์ดํํ ์ ์์ต๋๋ค.
128์์ ํ ๋ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก 2๋ฐ์ดํธ ์ธ์ฝ๋ฉ์ ์ด๊ณผํ๋ ๋ฌธ์์ ๋ํด ํ ์ ์์ต๋๋ค. (๊ต์ฅํ ๊ตฌ์ฒด์ ์ธ ์ซ์์ฒ๋ผ ๋ค๋ฆฌ์ง ์์ต๋๊น?)
๋ ๋ฒ์งธ ๋ฐ์ดํธ ์์น์ ์ต์์ ๋นํธ๊ฐ ์ฌ์ฉ ์ค์ผ ๋ ์ด๋ฅผ ๋ฐ์ผ๋ก ์๋ฅด๋ฉด 1์ด์ด์ผ ํ๋ ์์น์ 0์ด ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์ง ๋ฐ์ดํฐ๋ก ๋ค์ ๋๋ํ ์คํ ์ดํ๋งํด๋ ๊ฐ์น ๊ฐ๋ ์ด ๋ค์ ์ ๊ฑฐ๋์ง ์์ต๋๋ค. ๋์ฝ๋ฉ๋ ๊ฐ์ ์ธ์ฝ๋ฉ๋ ๊ฐ๊ณผ ๋์ผํ์ง ์์ผ๋ฉฐ ์ธ์ฝ๋ฉ์ด ์๋ ๋์ฝ๋ฉ์ ์ถ๊ฐํฉ๋๋ค.
๋๋ถ๋ถ์ ์ด๋ชจํฐ์ฝ์ด ์ด ๋ฒ์ ๋ฐ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํฌ๊ท ์ค๊ตญ์ด, ๋๋ถ๋ถ์ ์ํ ๋ฐ ์์ ๊ธฐํธ๋ฅผ ํฌํจํ์ฌ ์ฌ๋ฌ ์ธ์ด์ ํฐ ๋ฉ์ด๋ฆฌ๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋ฌผ๋ก , ๋น์ ์ ์ ๊ทผ ๋ฐฉ์์ ๊ฑฐ์ ๋ชจ๋ ์ด๋ชจํฐ์ฝ๊ณผ ์ ๋์ฝ๋ 6์ผ๋ก ๋ค์ด๊ฐ ์ ์์ ๋งํผ ์ผ๋ฐ์ ์ธ ๋ชจ๋ ์ธ๊ฐ ์ธ์ด์ ๋ํด ์ถฉ๋ถํ ํ๋ฅญํฉ๋๋ค. ์ด๋ ํ์ ์ ์ง์ ๋นํด ์์ฒญ๋ ๊ฐ์ ์ ๋๋ค
๊ทธ๋ฌ๋ ์ด PR์ ์ ํ์ฑ๊ณผ ์์์น ๋ชปํ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํด ์ถฉ๋ถํ ํ ์คํธ๋๋ฉด ์ค์ ๋ก ๋ณํฉ๋์ด์ผ ํฉ๋๋ค(์ ๋์ฝ๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ php๊ฐ ์ฃฝ์ ์ด์ ์์ ๊ธฐ์ตํ์ญ์์ค)
. (dot character)
ํํ์์๋ ์ ๋์ฝ๋ ๋ชจ๋๊ฐ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋น๊ตํ๋ค:
const string = '-๐-๐ฑ-';
const symbols = (string.match(/./gu));
console.log(JSON.stringify(symbols, null, ' '));
const pegResult = require('pegjs/')
.generate('root = .+')
.parse(string);
console.log(JSON.stringify(pegResult, null, ' '));
์ฐ์ถ:
[
"-",
"๐",
"-",
"๐ฑ",
"-"
]
[
"-",
"\ud83d",
"\udc0e",
"-",
"\ud83d",
"\udc71",
"-"
]
์ต๊ทผ์ #616์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ ES6 ๊ตฌ๋ฌธ \u{hhhhhhh}
์ ์ฌ์ฉํ๋๋ก ์์ ํ์ฌ ์ด ์์
์ ์ํํ์ต๋๋ค. ๋ช ์๊ฐ ๋ด์ PR์ ๋ง๋ค ๊ฒ์
๋๋ค.
์๋ก๊ฒ์ดํธ๋ก ๋ถํ ๋ UTF-16 ์ ๊ท์ ๋ฒ์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ์ฝ๊ฐ ๋ณต์กํ๋ฉฐ ์ด๋ฅผ ์ํด https://github.com/mathiasbynens/regenerate ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์ด๊ฒ์ ํจํค์ง pegjs์ ์ฒซ ๋ฒ์งธ ์ข ์์ฑ์ด ๋ ๊ฒ์ ๋๋ค. ๊ฐ๋ฅํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค(์ข ์์ฑ์ผ๋ก ์ถ๊ฐ๋ ์ ์๋ ์ ๋์ฝ๋ ์์ฑ์ ๋ํ ํด๋ฆฌํ๋ ์์ต๋๋ค. #648 ์ฐธ์กฐ). UTF-16 ๋๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ Wikipedia๋ฅผ ์ฐธ์กฐํ์ญ์์ค .
PEG.js๋ฅผ ์ ์ฒด ์ ๋์ฝ๋์ ํธํ๋๋๋ก ๋ง๋ค๊ธฐ ์ํด ๋ค์ํ ์์ค์ด ์์ต๋๋ค.
.
๊ท์น์ ๊ตฌํํ์ฌ 1๊ฐ ๋๋ 2๊ฐ์ ์ฝ๋ ๋จ์๋ฅผ ํฌ์ฐฉํฉ๋๋ค.๋๋ถ๋ถ์ ํฌ์ธํธ์ ๋ํด ์ฐ๋ฆฌ๋ ์ด์ ๋ฒ์ ๊ณผ ๋งค์ฐ ์ ์ฌํ ํ์๋ฅผ ์ด์ ๋ฒ์ ๊ณผ ๋งค์ฐ ์ ์ฌํ ํ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ํ์ฑ ๊ฒฐ๊ณผ๋ ์ ๊ท์น์ด ํ๋ ๋๋ ๋ ๊ฐ์ ์ฝ๋ ๋จ์๋ฅผ ์บก์ฒํ๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฅผ ์ํด ์ฌ์ฉ์๊ฐ ๋ ๊ฐ์ง ๋๋ ์ธ ๊ฐ์ง ์ ํ ์ค์์ ์ ํํ ์ ์๋๋ก ๋ฐํ์ ์ต์ ์ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค.
Regex ํด๋์ค๋ ๊ณ ์ ๊ธธ์ด(์ฝ๋ ๋จ์ ์)๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด ํ์ ์์ฑ ์ค์ ์ ์ ์ผ๋ก ๋ถ์๋ ์ ์์ต๋๋ค. 3๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. 1. BMP ๋๋ ๋จ์ผ ์ฝ๋ ๋จ์๋ง, 2. ๋ ๊ฐ์ ์ฝ๋ ๋จ์๋ง, ๋๋ 3. ๋ฐํ์์ ๋ฐ๋ผ ํ๋ ๋๋ ๋ ๊ฐ์ ์ฝ๋ ๋จ์. ํ์ฌ ๋ฐ์ดํธ์ฝ๋๋ ์ ๊ท์ ํด๋์ค๊ฐ ํญ์ ํ๋์ ์ฝ๋ ๋จ์๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค( ์ฌ๊ธฐ ์ฐธ์กฐ ). ์ ์ ๋ถ์์ ํตํด ์ด ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฒซ ๋ฒ์งธ ๋ ๊ฒฝ์ฐ์ ๋ํด 1 ๋๋ 2๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ๋ฐํ์์ ์ผ์นํ๋ ์ฝ๋ ๋จ์ ์๋ฅผ ์ป๊ณ ๊ทธ์ ๋ฐ๋ผ ์ปค์๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด ์ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ ์ถ๊ฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ก์ด ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด๊ฐ ์๋ ๋ค๋ฅธ ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. 1. ํญ์ ์ผ์นํ๋ ์ฝ๋ ๋จ์ ์๋ฅผ ๊ณ์ฐํ์ง๋ง ์ด๊ฒ์ BMP ์ ์ฉ ํ์์ ๋ํ ๊ตฌ๋ฌธ ๋ถ์ ์ค ์ฑ๋ฅ ์ ํ์ด๋ฏ๋ก ์ด ์ต์ ์ ์ข์ํ์ง ์์ต๋๋ค. 2. ํ์ฌ ์ฝ๋ ๋จ์๊ฐ 1 ๋๋ 2์ ์ฆ๋ถ์ ๋ํด ๋ฎ์ ๋๋ฆฌ๊ฐ ๋ค๋ฐ๋ฅด๋ ์์ ๋๋ฆฌ์ธ์ง ๊ณ์ฐํ๊ธฐ ์ํด, ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ฌธ๋ฒ์ด ๊ณ ๋ ํ ๋๋ฆฌ๋ก ๋ฌธ๋ฒ์ ์์ฑํ ๊ฐ๋ฅ์ฑ ์์ด ํญ์ ์ ๊ตฌ์ฑ๋ UTF-16 ๋๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค( ๋ค์ ํญ๋ชฉ ์ฐธ์กฐ) ์ด๋ BMP ์ ์ฉ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ์ ์ฑ๋ฅ ์ ํ์ด๊ธฐ๋ ํฉ๋๋ค.
๊ณ ๋ ํ ๋๋ฆฌ(๋ค์ ํ์ ๋๋ฆฌ๊ฐ ์๋ ์์ ๋๋ฆฌ ๋๋ ์์ ๋๋ฆฌ๊ฐ ์๋ ํ์ ๋๋ฆฌ)์ ๋ํ ์ง๋ฌธ์ด ์์ต๋๋ค. ์ด์ ๋ํ ๋ด ์๊ฒฌ์ ์ ๊ท์ ํด๋์ค๊ฐ ๋ ์ ์ ์ด์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ ๊ตฌ์ฑ๋ UTF-16 ์ ๋์ฝ๋ ๋ฌธ์(BMP ๋๋ ์์ ๋๋ฆฌ ๋ค์์ ํ์ ๋๋ฆฌ)๊ฐ ์๋ ๊ณ ๋ ํ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฌธ๋ฒ ์์ฑ์๊ฐ ์ธ์ํ์ง ๋ชปํ๋ ์ํ์ด ์์ต๋๋ค. UTF-16์ ๋ฏธ๋ฌํจ์ ๋์ ํผํฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. UTF-16 ๋๋ฆฌ๋ฅผ ์ค์ค๋ก ๊ด๋ฆฌํ๋ ค๋ ๋ฌธ๋ฒ ์์ฑ์๋ PEG ๊ท์น์ ์ฌ์ฉํ์ฌ ํน์ ์์ ๋๋ฆฌ์ ํ์ ๋๋ฆฌ ์ฌ์ด์ ๋งํฌ๋ฅผ ์ค๋ช ํ ์ ์์ต๋๋ค. ํ์ ์์ฑ ์ค์ ์ด ๊ท์น์ ์ํํ๋ ๋ฐฉ๋ฌธ์๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, PEG ํ์๋ ํญ์ ์ ์งํ๊ธฐ ๋๋ฌธ์ ์ ๊ท์๋ณด๋ค PEG์์ ๊ณ ๋ ํ ๋๋ฆฌ์ ๋ฌธ์ ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ์ ์์ต๋๋ค. ์์ ์๋ก๊ฒ์ดํธ๋ฅผ ํ์ ์๋ก๊ฒ์ดํธ์ ์ฐ๊ฒฐ ํด์ ํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ผ์นํ๋ ์ ๋์ฝ๋ ๋ฌธ์ ์ ๋ฑ์ ๋ณ๊ฒฝํฉ๋๋ค.
์์คํธ๋ ์ ๋์ฝ๋ ๋ฌธ์์ ๋ํ ES6 ๊ตฌ๋ฌธ์ ๋ํ PR์ #616์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ #651์ด๊ณ ํด๋์ค ๊ฐ๋ฐ์ https://github.com/Seb35/pegjs/commit/0d33a7a4e13b0ac7c55a9cfaadc16fc0a5dd5f0c์
๋๋ค. ์ปค์ ์ฆ๊ฐ(4๋ฒ ์ง์ )์ ๋ํ ๋น ๋ฅธ ํดํน๊ณผ .
๊ท์น ์ (5๋ฒ ์ง์ )์ ๋ํด์๋ ํ์ฌ๋ก์๋ ์๋ฌด ๊ฒ๋ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํ์ฌ ๊ฐ๋ฐ์ ๋๋ถ๋ถ ์๋ฃ๋์์ผ๋ฉฐ ๋ ๊ณ ๊ธ ์์ ์ https://github.com/Seb35/pegjs/tree/dev-astral-classes-final์ ์์ต๋๋ค. ์์์ ์ธ๊ธํ 5๊ฐ์ง ์ฌํญ์ด ๋ชจ๋ ์ฒ๋ฆฌ๋๊ณ ์ ์ญ ๋์์ ์์ง ์ผ์ด์ค์ ๊ด๋ จํ์ฌ JS ์ ๊ท์์ ๋ชจ๋ฐฉํ๋ ค๊ณ ์๋ํฉ๋๋ค(๋ง์ ๊ฒฝ์ฐ๊ฐ ์์).
์ ์ญ ๋์์ JS ์ ๊ท์์ ํ๋๊ทธ unicode
unicode
์ ์ ์ฌํ [^a]
๋ "๐ฏ" ํ
์คํธ์ ์ผ์นํ๊ณ ์ปค์๊ฐ 2 ์ฝ๋ ๋จ์๋ก ์ฆ๊ฐํฉ๋๋ค. unicode
์ต์
์ด false์ธ ๊ฒฝ์ฐ ์ปค์๋ ํญ์ 1 ์ฝ๋ ๋จ์๋ก ์ฆ๊ฐํฉ๋๋ค.
์
๋ ฅ๊ณผ ๊ด๋ จํ์ฌ JS regexes์ ๋์ผํ ๋ฐฉ์์ผ๋ก PEG.js๋ฅผ ๋์์ธํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ๋น์ ๋์ฝ๋ ๋ชจ๋์ ๋ฌธ๋ฒ์์ [\u{1F4AD}-\u{1F4AF}]
( [\uD83D\uDCAD-\uD83D\uDCAF]
) ๋ฅผ ์น์ธํด์ผ ํฉ๋๊น? "์
๋ ฅ ์ ๋์ฝ๋"์ "์ถ๋ ฅ ์ ๋์ฝ๋"๋ฅผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์
๋ ฅ ์ ๋์ฝ๋๋ฅผ ์๊ตฌ์ ์ผ๋ก ๋๋ ๊ธฐ๋ณธ true
์ต์
์ ์ฌ์ฉํ์ฌ ์ธ์ฆํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์๋ํ๋ฉด ์๋นํ ์ค๋ฒํค๋๊ฐ ์๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ฌ๋์ด ์ด ๊ฐ๋ฅ์ฑ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ถ๋ ฅ ์ ๋์ฝ๋๋ false
์ ์ง๋์ด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด ๋ฌธ์ ์ ๊ด๋ จํ์ฌ(๋ฐ ๊ธฐ๋ณธ๊ฐ์ด false
์ถ๋ ฅ ์ ๋์ฝ๋์ ๋ํด) UTF-16์ ๊ธฐ๋ฅ์ ์ดํดํ๋ ๋๊ฐ๋ก ์ด๋ฏธ ๋ฌธ๋ฒ์์ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉํ ๊ฐ๋ฅ์ฑ์ด ์์์ ๋ช
์ฌํด์ผ ํฉ๋๋ค. :
// rule matching [\u{1F4AD}-\u{1F4AF}]
my_class = "\uD83D" [\uDCAD-\uDCAF]
// rule matching any Unicode character
my_strict_unicode_dot_rule = $( [\u0000-\uD7FF\uE000-\uFFFF] / [\uD800-\uDBFF] [\uDC00-\uDFFF] )
// rule matching any Unicode character or a lone surrogate
my_loose_unicode_dot_rule = $( [\uD800-\uDBFF] [\uDC00-\uDFFF]? / [\u0000-\uFFFF] )
๋ฐ๋ผ์ ๋น ๋ฅธ ํ์๋ฅผ ์ํ๊ณ ๋ฌธ๋ฒ์ ํน์ ๋ถ๋ถ์์ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ์ธ์ํ ์ ์๋ ๋ฌธ๋ฒ ์์ฑ์๋ ์ด๋ฌํ ๊ท์น์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ๋ฌธ์ ๋ UTF-16 ๋ด๋ถ๋ฅผ ์ดํด๋ณด์ง ์๊ณ ์ ๋์ฝ๋ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค.
๊ตฌํ์ ๋ํด, ๋๋ ๋ฌธ๋ฒ ํ
์คํธ๊ฐ ์ ๋์ฝ๋ ๋ฌธ์๋ก ์ธ์ฝ๋ฉ๋์๊ณ PEG.js ํ์์ '์ ' ๊ท์น์ด ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ์ธ์ํ๋ค๊ณ ์ฒซ ๋ฒ์งธ ์๋ ์์ ๊ณ ๋ คํ์ต๋๋ค. ๋ ๋ฒ์งธ์ด์ ๋ง์ง๋ง ์๋ ๋ ์ด๊ฒ์ ๋๋๋ ธ๊ณ (๋น ๋ฅธ ๊ตฌ๋ฌธ ๋ถ์์ ์ํด ์ ๊ท์น์ ํญ์ 1 ์ฝ๋ ๋จ์์) ๋ฐฉ๋ฌธ์ prepare-unicode-classes.js์ ๋ฌธ์ ํด๋์ค์ ๋ถํ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ด ์์ต๋๋ค(์: [\uD83D\uDCAD-\uD83D\uDCAF]
๋ ๊ตฌ๋ฌธ์ [ "\uD83D", [ "\uDCAD", "\uD83D" ], "\uDCAF" ]
๋ก ์ธ์๋๋ฉฐ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ด๊ฒ์ [ [ "\uD83D\uDCAD", "\uD83D\uDCAF" ] ]
๋ณํํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ๋ฌธ๋ฒ ์์ฒด์ ์์ฑํ๋ ๊ฒ์ ์์ํ์ง๋ง ๊ธธ๊ณ ๋ ์ค์ํ๊ฒ๋ ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ("๐ฏ", "uD83DuDCAF", "u{1F4AF}")์ด ์์ผ๋ฏ๋ก ์ฐ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ๋ฐฉ๋ฌธ์์์.
๋ ๋ฒ์งธ ์๋์์ ๋ ๊ฐ์ opcode๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
(input.charCodeAt(currPos) & 0xFC00) === 0xD800 && input.length > currPos + 1 && (input.charCodeAt(currPos+1) & 0xFC00) === 0xDC00
์ ์ผ์นํฉ๋๋ค.classes[c].test(input.substring(currPos, currPos+2)
๋์ ๋ค์ ๋ ์ฝ๋ ๋จ์๋ฅผ ์ผ์น์ํต๋๋ค.ACCEPT_N
์ฌ์ฉํ์ฌ 1 ๋๋ 2 ์ฝ๋ ๋จ์๋ก ์ฆ๊ฐํ๊ณ ๋ฌธ์ ํด๋์ค๋ ๋ ๊ฐ๋ก ๋ถํ ๋ฉ๋๋ค. ๊ณ ์ ๊ธธ์ด์ ์ ๊ท์(1 ๋๋ 2 ์ฝ๋ ๋จ์).๋ชจ๋(์ ๋์ฝ๋ ์ฌ๋ถ)์ ๋ฌธ์ ํด๋์ค์ ๋ฐ๋ผ "๋ฐ๋ ์ฝ๋" ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ ๋์ ์ ๊ฑฐํ์ฌ "์ผ์น" ๊ธฐ๋ฅ์ผ๋ก ๋ช ๊ฐ์ง ์ต์ ํ๋ฅผ ์ํํ์ต๋๋ค.
๋ํ ์ด ๊ตฌํ์์ ์ ๊ท์์ ํญ์ ์์์ ๋๋ค. ์ญ ์ ๊ท์์ ๋ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ฌ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ก๊ฒ์ดํธ ์ฃผ๋ณ์ ์ฃ์ง ์ผ์ด์ค๋ฅผ ํผํ๊ธฐ๊ฐ ๋ ์ฌ์ ์ต๋๋ค.
๋ช ๊ฐ์ง ๋ฌธ์๋ฅผ ์์ฑํ์ง๋ง ์๋ง๋ ๋ช ๊ฐ์ง๋ฅผ ๋ ์ถ๊ฐํ ๊ฒ์ ๋๋ค(์๋ง๋ ์ต์ ์ ๋์ฝ๋์ ์ธ๋ถ ์ฌํญ๊ณผ ์ง์์ ๋ง๋ ์ ๋์ฝ๋ ์ ๊ท์น์ด ์๋ ์ค๋ํซ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ์ค๋ช ํ๊ธฐ ์ํ ๊ฐ์ด๋). PR๋ก ์ ์ถํ๊ธฐ ์ ์ ํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.