Pegjs: ์™„์ „ํ•œ ์œ ๋‹ˆ์ฝ”๋“œ ์ง€์›, ์ฆ‰ BMP ์™ธ๋ถ€์˜ ์ฝ”๋“œํฌ์ธํŠธ

์— ๋งŒ๋“  2018๋…„ 10์›” 22์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pegjs/pegjs

๋ฌธ์ œ ์œ ํ˜•

  • ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ: ์˜ˆ
  • ๊ธฐ๋Šฅ ์š”์ฒญ: ์ข€
  • ์งˆ๋ฌธ: ์•„๋‹ˆ์˜ค
  • ๋ฌธ์ œ ์•„๋‹˜: ์•„๋‹ˆ์˜ค

์ „์ œ ์กฐ๊ฑด

  • ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?: ์˜ˆ
  • ์ €์žฅ์†Œ ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์…จ์Šต๋‹ˆ๊นŒ?: ์˜ˆ
  • ํฌ๋Ÿผ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๊นŒ?: ์˜ˆ
  • ์›น ๊ฒ€์ƒ‰(google, yahoo ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•˜์…จ์Šต๋‹ˆ๊นŒ?: ์˜ˆ

์„ค๋ช…

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๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฒˆ์‹ ๋‹จ๊ณ„

  1. ์•„๋ž˜ ์ฃผ์–ด์ง„ ๋ฌธ๋ฒ•์—์„œ ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.
  2. ํ‘œ๋ฉด์ ์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ:

์ด ๋ฌธ๋ฒ•:

//MathUpper = [๐€-๐™]+
MathUpperEscaped = [\u1D400-\u1D419]+

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘:

์ง€์ •๋œ ๋ฌธ๋ฒ•์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์„œ๋Š” "๐€๐๐‚"์™€ ๊ฐ™์ด ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ํ–‰๋™:

๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜: Line 1, column 1: Expected [แต€0-แต9] but " (๋˜๋Š” ๋‹ค๋ฅธ ๊ทœ์น™์˜ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ "์ž˜๋ชป๋œ ๋ฌธ์ž ๋ฒ”์œ„" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.)

์†Œํ”„ํŠธ์›จ์–ด

  • PEG.js: 0.10.0
  • Node.js: ํ•ด๋‹น ์‚ฌํ•ญ ์—†์Œ.
  • NPM ๋˜๋Š” Yarn: ํ•ด๋‹น ์—†์Œ.
  • ๋ธŒ๋ผ์šฐ์ €: ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ•œ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €.
  • OS: macOS ๋ชจํ•˜๋น„.
  • ํŽธ์ง‘์ž: ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ•œ ๋ชจ๋“  ํŽธ์ง‘์ž.
feature need-help task

๋ชจ๋“  15 ๋Œ“๊ธ€

์†”์งํžˆ ๋งํ•ด์„œ, 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 - ์ตœ์„ ์„ ๋‹คํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์œ ๋‹ˆ์ฝ”๋“œ์—๋Š” ์ธ์ฝ”๋”ฉ, ํ‘œ๊ธฐ๋ฒ• ๋ฐ ๋ฒ”์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    1. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ "๋ฒ”์œ„" - ์ง€์›๋˜๋Š” ๋ฌธ์ž - ๋ฐ "ํ‘œ๊ธฐ๋ฒ•" - ์ž‘์„ฑ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

    2. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์ด๋‚˜ ์Œํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ์™€ ๊ฐ™์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒˆ ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  2. ์œ ๋‹ˆ์ฝ”๋“œ์—๋Š” "ํ‘œ๊ธฐ๋ฒ•"์ด ์žˆ์Šต๋‹ˆ๋‹ค. utf-16 , ucs4 ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์˜๋„ํ•œ ๋ฐ์ดํ„ฐ์ธ codepoints ๋ฅผ ๋ฐ”์ดํŠธ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด utf-16-le ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ž๋ฅผ code units ๋ผ๋Š” 2๋ฐ”์ดํŠธ ์Œ์œผ๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ”๋“œ ๋‹จ์œ„ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ 0x10ffff ๊นŒ์ง€ ๊ฐ’์ด ๋†’์€ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    1. ์ฃผ์š” ์ดํ•ด: ์ถฉ๋ถ„ํžˆ ๋†’์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ชจํ‹ฐ์ฝ˜, ์—ญ์‚ฌ์  ์ค‘๊ตญ์–ด์˜ ํฐ ๋ฉ์–ด๋ฆฌ, ์ด ๊ฒŒ์‹œ๋ฌผ์˜ ๊ธฐ๋ณธ ์งˆ๋ฌธ(์น ํŒ ์ˆ˜ํ•™ ๋ฌธ์ž)๊ณผ ๊ฐ™์€ ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ํ•ญ๋ชฉ์ด ํ•ด๋‹น ํ–‰ ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค.



      1. ISO์™€ ์œ ๋‹ˆ์ฝ”๋“œ ์ปจ์†Œ์‹œ์—„์€ ๋ถ„๋ช…ํžˆ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ฒฐ์ฝ” ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋” ๋†’์€ ๋ฌธ์ž๋ฅผ ์›ํ•˜๋ฉด utf-16๋ณด๋‹ค ํฐ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.



    2. ํ•ต์‹ฌ ์ดํ•ด #2: ๋นŒ์–ด ๋จน์„ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณต์‹์ ์œผ๋กœ utf16์ž…๋‹ˆ๋‹ค



      1. ์ด๊ฒƒ์€ Javascript ๋ฌธ์ž์—ด ์œ ํ˜•์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž(๋งŽ์€ ๋ฌธ์ž)๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


      2. OP์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.


      3. ์ด๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‰ฝ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ฅ์˜ ๋‘ฅ์ง€๋กœ ์œ ๋ช…ํ•œ ์œ ๋‹ˆ์ฝ”๋“œ ๊ตฌ๋ฌธ ๋ถ„์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.



๋‚˜๋„ ์ด๊ฑฐ ํ•˜๊ณ  ์‹ถ์€๋ฐ ํ˜„์‹ค์ ์œผ๋กœ ์•ˆ๋ ๋“ฏ

์  ์žฅ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฑฐ์˜ 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. #616 ๋˜๋Š” ๋‚ด ES6 ๊ตฌ๋ฌธ ๋ฒ„์ „์œผ๋กœ ์ˆ˜์ •๋œ BMP ์œ„์— ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด์ „ ํฌ์ธํŠธ์—์„œ ์ง์ ‘ ์ œ๊ณตํ•œ ์ƒ์ˆ˜ ๋ฌธ์ž์—ด์„ ์ธ์‹ํ•˜๊ณ ,
  3. ์‹ค์ œ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด 1 ๋˜๋Š” 2 ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก SyntaxError ๋ณด๊ณ ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. BMP ๋ฐ/๋˜๋Š” ์•„์ŠคํŠธ๋ž„ ์ฝ”๋“œ ํฌ์ธํŠธ์— ๋Œ€ํ•œ ์ •๊ทœ์‹ ํด๋ž˜์Šค๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํฌ์ธํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  5. ์ •๊ทœ์‹ ํด๋ž˜์Šค๊ฐ€ ์ด์ œ (1), (2) ๋˜๋Š” (๋Ÿฐํƒ€์ž„์— ๋”ฐ๋ผ 1 ๋˜๋Š” 2)์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ปค์„œ ์ฆ๊ฐ€๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  6. ์  . ๊ทœ์น™์„ ๊ตฌํ˜„ํ•˜์—ฌ 1๊ฐœ ๋˜๋Š” 2๊ฐœ์˜ ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํฌ์ธํŠธ์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ํŒŒ์„œ๋ฅผ ์ด์ „ ๋ฒ„์ „๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๋Š” ์  ๊ทœ์น™์ด ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ์บก์ฒ˜ํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋‘ ๊ฐ€์ง€ ๋˜๋Š” ์„ธ ๊ฐ€์ง€ ์„ ํƒ ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋Ÿฐํƒ€์ž„ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  1. ์  ๊ทœ์น™์€ BMP ์ฝ”๋“œ ๋‹จ์œ„๋งŒ ์บก์ฒ˜ํ•˜๊ณ ,
  2. ์  ๊ทœ์น™์€ ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ(1 ๋˜๋Š” 2 ์ฝ”๋“œ ๋‹จ์œ„)๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ์  ๊ทœ์น™์€ ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ ๋˜๋Š” ๋‹จ๋… ๋Œ€๋ฆฌ์ž๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

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] ) ๋ฅผ ์Šน์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? "์ž…๋ ฅ ์œ ๋‹ˆ์ฝ”๋“œ"์™€ "์ถœ๋ ฅ ์œ ๋‹ˆ์ฝ”๋“œ"๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ์œ ๋‹ˆ์ฝ”๋“œ๋Š” ๋ฌธ์ž ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ์Šน์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‚ด๋ถ€์ ์œผ๋กœ ๊ณ ์ • 2์ฝ”๋“œ ๋‹จ์œ„ ๋˜๋Š” ๊ณ ์ • 1์ฝ”๋“œ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐ๋จ).
  • ์ถœ๋ ฅ ์œ ๋‹ˆ์ฝ”๋“œ๋Š” ๊ฒฐ๊ณผ ํŒŒ์„œ์˜ ์ปค์„œ ์ฆ๋ถ„์ž…๋‹ˆ๋‹ค. 'dot' ๋ฐ 'inverted characters class' ๊ทœ์น™์— ๋Œ€ํ•ด 1๊ฐœ์˜ ์ฝ”๋“œ ๋‹จ์œ„ ๋˜๋Š” 1๊ฐœ์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž โ€“ ๋ฌธ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ด๋˜์ง€ ์•Š๊ณ  ๋ฌธ๋ฒ•์—์„œ ๊ฒฐ์ •์ด ํ•„์š”ํ•œ ์œ ์ผํ•œ ๊ทœ์น™ ์ž‘๊ฐ€

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ์ž…๋ ฅ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋˜๋Š” ๊ธฐ๋ณธ 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๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • MATCH_ASTRAL์€ MATCH_ANY์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž (input.charCodeAt(currPos) & 0xFC00) === 0xD800 && input.length > currPos + 1 && (input.charCodeAt(currPos+1) & 0xFC00) === 0xDC00 ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • MATCH_CLASS2๋Š” MATCH_CLASS์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ classes[c].test(input.substring(currPos, currPos+2) ๋Œ€์‹  ๋‹ค์Œ ๋‘ ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.
    ๊ทธ๋Ÿฐ ๋‹ค์Œ 2-์ฝ”๋“œ ๋‹จ์œ„ ๋ฌธ์ž ๋˜๋Š” 1-์ฝ”๋“œ-๋‹จ์œ„ ๋ฌธ์ž๋ฅผ ์ผ์น˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ปค์„œ๊ฐ€ opcode ACCEPT_N ์‚ฌ์šฉํ•˜์—ฌ 1 ๋˜๋Š” 2 ์ฝ”๋“œ ๋‹จ์œ„๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ๋ฌธ์ž ํด๋ž˜์Šค๋Š” ๋‘ ๊ฐœ๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค. ๊ณ ์ • ๊ธธ์ด์˜ ์ •๊ทœ์‹(1 ๋˜๋Š” 2 ์ฝ”๋“œ ๋‹จ์œ„).

๋ชจ๋“œ(์œ ๋‹ˆ์ฝ”๋“œ ์—ฌ๋ถ€)์™€ ๋ฌธ์ž ํด๋ž˜์Šค์— ๋”ฐ๋ผ "๋ฐ๋“œ ์ฝ”๋“œ" ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ ์ œ๊ฑฐํ•˜์—ฌ "์ผ์น˜" ๊ธฐ๋Šฅ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ๊ตฌํ˜„์—์„œ ์ •๊ทœ์‹์€ ํ•ญ์ƒ ์–‘์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ญ ์ •๊ทœ์‹์€ ๋ฐ˜๋Œ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋กœ๊ฒŒ์ดํŠธ ์ฃผ๋ณ€์˜ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ํ”ผํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์› ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ์•„๋งˆ๋„ ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋” ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์•„๋งˆ๋„ ์˜ต์…˜ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ๊ณผ ์ง‘์—์„œ ๋งŒ๋“  ์œ ๋‹ˆ์ฝ”๋“œ ์  ๊ทœ์น™์ด ์žˆ๋Š” ์Šค๋‹ˆํŽซ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ด๋“œ). PR๋กœ ์ œ์ถœํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

futagoza picture futagoza  ยท  13์ฝ”๋ฉ˜ํŠธ

alanmimms picture alanmimms  ยท  10์ฝ”๋ฉ˜ํŠธ

futagoza picture futagoza  ยท  6์ฝ”๋ฉ˜ํŠธ

audinue picture audinue  ยท  13์ฝ”๋ฉ˜ํŠธ

brettz9 picture brettz9  ยท  8์ฝ”๋ฉ˜ํŠธ