Pegjs: ๋‹ค๋ฅธ ๋ฌธ๋ฒ• ๊ฐ€์ ธ์˜ค๊ธฐ/ํฌํ•จ

์— ๋งŒ๋“  2011๋…„ 08์›” 16์ผ  ยท  32์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pegjs/pegjs

๋‹ค๋ฅธ ๋ฌธ๋ฒ•์—์„œ ๊ทœ์น™์„ ๊ฐ€์ ธ์™€ ๋ฌธ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด ;

<strong i="7">@include</strong> "expression.pegjs"
(or <strong i="8">@from</strong> "expression.pegjs" import expression)

tag_if
    = "if" space? expression space? { ... }

<strong i="9">@import</strong> "expression.pegjs" as expr

tag_if
    = "if" space? expr.expression space?

์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  .pegjs์—์„œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” parse() ์˜ ๋™์ž‘์„ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

options ๋ฌธ์ œ์—์„œ ๋งํ•œ ๋Œ€๋กœ ํŽธ์ง‘ ;

parse(input, startRule)
->
parse(input, { startRule: "...", startPos : 9000 })

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— startPos != 0 && result !== null ์ด๋ฉด input.length ๊นŒ์ง€ ๊ฐ”๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๊ฒฐ๊ณผ์™€ endPos๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. - ๋‹จ์ˆœํžˆ ์˜ต์…˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?).

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

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@Dignifiedquire ํ˜„์žฌ ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€์žฅ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ์ฒด๊ณ„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์  ์–ธ์–ด.pegjs

langauges  = "C" / "C++" / "Java" / "C#"

๋™์  ์–ธ์–ด.pegjs

languages = "Ruby" / "Python" / "JavaScript"

๋ชจ๋“  ์–ธ์–ด.pegjs

static  = require("./static-languages")
dynamic = require("./dynamic-languages")

all = static.languages / dynamic.languages

๊ฐ .pegjs ํŒŒ์ผ์€ ํฌํ•จ๋œ ๋ชจ๋“  ๊ทœ์น™์„ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์„ ์•”์‹œ์ ์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. <name> = require(<module>) ๊ตฌ๋ฌธ์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๊ทœ์น™์„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋””์ž์ธ์€ ์˜๋„์ ์œผ๋กœ Node.js์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๋Š” ๋‘ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. <name> = require(<module>) ๊ตฌ์กฐ๋Š” ๊ทœ์น™ ์ •์˜์™€ ๋„ˆ๋ฌด ์œ ์‚ฌํ•˜์—ฌ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜๋‚˜์˜ ๊ทœ์น™๋งŒ ๊ฐ€์ ธ์˜จ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Œ).
  2. . ๊ตฌ๋ฌธ์€ "๋ชจ๋“  ๋ฌธ์ž"์ธ . ์˜ ํ˜„์žฌ ์˜๋ฏธ์™€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถ”์•…ํ•œ ํ•ดํ‚น(์˜ˆ: ๊ณต๋ฐฑ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ . ์€ "๋ชจ๋“  ๋ฌธ์ž"๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ฐ˜๋ฉด ์‹๋ณ„์ž๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ . ์€ ๊ทœ์น™ ์ด๋ฆ„์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์„ ๋ถ„๋ฆฌํ•จ) ๋˜๋Š” ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ(์˜ˆ: any ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "๋ชจ๋“  ๋ฌธ์ž"๋ฅผ ๋‚˜ํƒ€๋ƒ„).

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

์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ์ ์— ๋™์˜ํ•˜๊ณ  1.0 ๋ฒ„์ „ ์ดํ›„์— ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

(BTW ๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ์•ˆํ•œ Python๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Node.js์˜ require ์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด JavaScript ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๋” ์นœ์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹ค๋ฆผ์งˆํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์†Œํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‚˜์˜ต๋‹ˆ๋‹ค.)

ํŒจ์น˜์™€ ํ•จ๊ป˜ ์ œ๊ณต๋œ๋‹ค๋ฉด 1.0 ์ด์ „์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํŒŒ์ด์ฌ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด +1

@ceymard ๋„ค, ๊ณ ๋ คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์— ๋Œ€ํ•ด +1 ๋ฐ require ์Šคํƒ€์ผ ํฌํ•จ์— ๋Œ€ํ•ด +1

@dmajda @ceymard ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด๋ฏธ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ง์žฅ์—์„œ ํ”„๋กœ์ ํŠธ์— ์ด๊ฒƒ์„ ํ•„์š”๋กœ ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ๋ฌธ๋ฒ•์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜๊ฑฐ๋‚˜ ์ƒ์†๊ณผ ๊ฐ™์€ ๊ฒƒ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ๊ทœ์น™์„ ์ƒ์†ํ•œ ๋‹ค์Œ ์ƒˆ ๋ฌธ๋ฒ•์˜ ํŠน์ • ๊ทœ์น™์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Dignifiedquire ํ˜„์žฌ ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€์žฅ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ์ฒด๊ณ„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์  ์–ธ์–ด.pegjs

langauges  = "C" / "C++" / "Java" / "C#"

๋™์  ์–ธ์–ด.pegjs

languages = "Ruby" / "Python" / "JavaScript"

๋ชจ๋“  ์–ธ์–ด.pegjs

static  = require("./static-languages")
dynamic = require("./dynamic-languages")

all = static.languages / dynamic.languages

๊ฐ .pegjs ํŒŒ์ผ์€ ํฌํ•จ๋œ ๋ชจ๋“  ๊ทœ์น™์„ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์„ ์•”์‹œ์ ์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. <name> = require(<module>) ๊ตฌ๋ฌธ์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๊ทœ์น™์„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋””์ž์ธ์€ ์˜๋„์ ์œผ๋กœ Node.js์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๋Š” ๋‘ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. <name> = require(<module>) ๊ตฌ์กฐ๋Š” ๊ทœ์น™ ์ •์˜์™€ ๋„ˆ๋ฌด ์œ ์‚ฌํ•˜์—ฌ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜๋‚˜์˜ ๊ทœ์น™๋งŒ ๊ฐ€์ ธ์˜จ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Œ).
  2. . ๊ตฌ๋ฌธ์€ "๋ชจ๋“  ๋ฌธ์ž"์ธ . ์˜ ํ˜„์žฌ ์˜๋ฏธ์™€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถ”์•…ํ•œ ํ•ดํ‚น(์˜ˆ: ๊ณต๋ฐฑ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ . ์€ "๋ชจ๋“  ๋ฌธ์ž"๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ฐ˜๋ฉด ์‹๋ณ„์ž๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ . ์€ ๊ทœ์น™ ์ด๋ฆ„์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์„ ๋ถ„๋ฆฌํ•จ) ๋˜๋Š” ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ(์˜ˆ: any ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "๋ชจ๋“  ๋ฌธ์ž"๋ฅผ ๋‚˜ํƒ€๋ƒ„).

@dmajda <identifier> = <expression> ํŒจํ„ด์€ ์ด๋ฏธ ๊ทœ์น™ ์ •์˜์— ์˜ํ•ด ์ฑ„ํƒ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค .

static := require("./static-languages")
dynamic := require("./dynamic-languages")

all = static::languages / dynamic::languages

:: ๋Š” ๋‚ด๊ฐ€ ์•„๋Š” PEG.js ์–ด๋””์—์„œ๋„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๊ธฐํƒ€ ํ•ญ๋ชฉ์„ ์‰ฝ๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. := ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์š”์ ์„ ์ „๋‹ฌํ•˜์ง€๋งŒ Javascript์— ๋Œ€ํ•ด ๋งค์šฐ ์ด์งˆ์ ์ธ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŒŒ์ผ๋‹น ํ•˜๋‚˜์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋งŒ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ์—ฌ๋Ÿฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

static := {
  languages  = "C" / "C++" / "Java" / "C#"
}

dynamic := {
  languages = "Ruby" / "Python" / "JavaScript"
}

๋‚˜๋Š” :: ๋ฐ := ์˜ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ javaScript/CoffeeScript ์„ธ๊ณ„์—์„œ ์™ธ๊ณ„์ธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ผ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํŒŒ์ผ์„ ์š”๊ตฌํ•จ์œผ๋กœ์จ๋งŒ ์•”์‹œ์ ์œผ๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ๊ฒƒ์€ ํฌ๊ฒŒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ:

<strong i="6">@require</strong> foo = "./foo"

bar = foo:languages

์ฝœ๋ก ์€ ์ ˆ์ถฉ์•ˆ์ด์ง€๋งŒ C++, C#, XML ๋“ฑ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

: ๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์  ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํ•ญ์ƒ cons ์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ตํ™˜์›์„ ๋ฉ€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. :: ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. C++ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? . ๋„ ๋‚˜์˜์ง€ ์•Š์€ ์„ ํƒ์ธ์ง€ ์•„์ง ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

. ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์–ธ์–ด์—์„œ ๋ชจํ˜ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

:: ๋Š” C++์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ, C#์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ(์˜ˆ global::System )์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. - ๋‹จ์ˆœ ์ƒ์†๋งŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด - pegjs ํŒŒ์ผ์„ ํ•จ๊ป˜ ๋ถ™์ด๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฌธ๋ฒ•์„ ๋„ˆ๋ฌด ์žฅํ™ฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ตฌ์ถ• ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์€ ๋ฉด์„ ๋ณด๋ฉด ์„ธ๋ถ„ํ™”๋œ DRY&OTW ๋ฌธ๋ฒ•์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆํฌ์—…๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๊ฒƒ์ด ์ด ์Šค๋ ˆ๋“œ์— ์ ํ•ฉํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ณ ๋ คํ•  ์˜ต์…˜์ผ ๋ฟ์ด๋ฏ€๋กœ ๊ฐ„๋‹จํ•œ__

languages = static__languages / dynamic__languages
<static-languages.pegjs>
<dynamic-languages.pegjs>
/* alternative */
languages = STATIC__languages / DYNAMIC__languages

@andreineculau ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ข…์†์„ฑ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋ฌธ๋ฒ•์—์„œ ์œ ์šฉํ•œ ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด(๊ฒฐํ•ฉ๋œ ๋ฌธ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹จ์ผ ํŒŒ์„œ๊ฐ€ ์ƒ์„ฑ๋จ) ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ณ  ๊ณต๊ฐœํ•˜์—ฌ ๋” ์˜๊ตฌ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ† ๋ก ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์‚ฌ์‹ค: ๋ฌธ๋ฒ• ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ํ™•์žฅ์„ ์ฃผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ์ด ๋ฌธ์ œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•œ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์—์„œ ๊ทœ์น™์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์–ดํ•˜๋Š” ์ฃผ๋œ ์ด์œ  ์ค‘ ํ•˜๋‚˜(๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ช…ํ™•์„ฑ)๋Š” ๊ณต์œ ํ•˜๋Š” ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋…ผ๋ฆฌ. ๋”ฐ๋ผ์„œ ์ƒ์„ฑ๋œ ํŒŒ์„œ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ์‹œ๊ฐ„์— ์˜๋ฏธ ์žˆ๊ฒŒ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ•˜๋‚˜์˜ ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ณด๋‹ค๋Š” ๋ฌธ๋ฒ• ํŠธ๋ฆฌ๊ฐ€ ํŒŒ์„œ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํŒŒ์„œ ์„ธํŠธ๊ฐ€ ์›น UI์˜ ์ผ๋ถ€๊ฐ€ ๋  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์—์„œ ๋ถˆํ•„์š”ํ•œ ํŒฝ์ฐฝ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@odonnell +1 ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด - ์‹œ๊ฐ„์ด ์žˆ์–ด๋„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…์„ ์œ„ํ•ด +1. ์ด๊ฒƒ์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์ ์ ˆํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ ๋น ๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@odonnell ๋‚ด ์˜๊ฒฌ์€ https://github.com/andreineculau/core-pegjs ์—์„œ ์˜จ๋ผ์ธ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ €๋ฅผ ์ฐŒ๋ฅด์‹ญ์‹œ์˜ค.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด +1

:+1:

:+1:

:+1:

๋‚ด๊ฐ€ ๊ฐ€์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” PEG.js์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ/ํ™•์žฅ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/casetext/pegjs-import.

์ด๊ฒƒ๋„ +1.

๋‚˜๋Š” ์ด๊ฒƒ์„ #308์—์„œ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๋ถ„ํ•ด ๊ทœ์น™์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ:+1:

์ถœ์‹œ๋ ์ง€ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.

:+1:

์—„์ฒญ๋‚œ! :+1:

@dmajda ์ด ํŒŒํ‹ฐ์— ๋Šฆ๊ฒŒ ์™”์ง€๋งŒ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋งŽ์€ ๊ทœ์น™์„ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. Url ๋ฐ Email ์„ ์ž‘์„ฑ๋œ ๋ฌธ๋ฒ•์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ Url HierarchicalPart ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์  Url ๊ฐœ์˜์น˜ ์•Š์Šต๋‹ˆ๋‹ค HierarchicalPart ๋ฐ AsciiLetter . Node์˜ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์ด์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ง์ ‘ ๋ช…๋ช…๋œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

import { SchemalessUrl, Url } from "./Urls.pegjs"

Token
  = PhoneNumber
  / Url
  / SchemalessUrl

๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฌธ๋ฒ•์„ โ€‹โ€‹์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ ํŒŒ์ผ์— ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ณ  PHP ํ•จ์ˆ˜๊ฐ€ ์ ์ ˆํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์ „์— ๋ช…๋ช…๋œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. UrlIpHost , HtmlQuotedString ๋“ฑโ€ฆ

@dmajda @futagoza

์ด ๋ฌธ์ œ์— ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” ํ˜„์žฌ #473์— ์žˆ๋Š” ๊ธฐ๋ณธ ํ† ๋ก ?
๋‚ด ๋ฌธ๋ฒ• ํŒŒ์ผ์ด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :(
์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ ํ•˜๋Š”๊ฒŒ ์ข‹์„๋“ฏ

๋‚˜๋Š” ๋‹จ์ˆœํžˆ ์กฐ์ง๊ณผ ๊ตฌ์„ฑ์„ ์œ„ํ•ด ํŒŒ์ผ ๊ฐ„์— ๋ฌธ๋ฒ•์„ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์„ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ.

์ œ๊ฐ€ ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ˆ์ œ๋Š” 1,300์ค„ ์ด์ƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ฐฐ์šฐ๊ณ  ๋‹ค๋ฅธ ์„น์…˜์„ ์ด๋™ํ•˜๊ณ  ํŽธ์ง‘ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

@mikeaustin ๋‚˜๋Š” ์ด ๊ธฐ๋Šฅ์„ ์ผ์ข…์˜ Node.JS required ๋กœ ๋ด…๋‹ˆ๋‹ค.

๊ณ ์–‘์ด bash.pegjs
{
const _ = ์š”๊ตฌ("๊ณต๋ฐฑ");
const LB = ์š”๊ตฌ("line_break");
const CodeBlock = ์š”๊ตฌ("์ฝ”๋“œ ๋ธ”๋ก");
const BoolExpr = require("๋ถ€์šธ ์‹");
}
...
IfStatement = "๋งŒ์•ฝ" _ "[" BoolExpr "]" _ ";" _ "๊ทธ๋Ÿผ" LB? ์ฝ”๋“œ๋ธ”๋ก "fi"

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์„ ๋ถ„ํ• ํ•˜๊ณ  ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
1- ์ฃผ ๋ฌธ๋ฒ• ์ฝ”๋“œ์— ์ •์˜๋œ ์ „์—ญ ๋ณ€์ˆ˜์— ์˜์กดํ•˜๋Š” ํ•˜์œ„ ๋ฌธ๋ฒ• ?
2- ๋ณ€์ˆ˜ ๋ฐ ๋ฌธ๋ฒ• ์ด๋ฆ„์ด ์ค‘๋ณต๋ฉ๋‹ˆ๊นŒ?

IMO, ์ผ์‹œ์ ์œผ๋กœ ํŽธ๋ฆฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์œ„ํ•œ ํ‚ค์›Œ๋“œ(์˜ˆ: @load(anotherGrammarFileLocation) )๋ฅผ ์ •์˜ํ•˜๋Š” PEG.js์šฉ ์ƒˆ ์• ๋“œ์˜จ(PEG.js์™€ ๋ณ„๊ฐœ)์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ๋Š” javacsript/peg.js ๋ฌธ๋ฒ•์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
reg-exp ๋˜๋Š” peg ๋ฌธ๋ฒ•์„ ๊ตฌ์ถ•ํ•˜์—ฌ ํ•ด๋‹น ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  "anotherGrammarFile Location" ์ฝ˜ํ…์ธ ๋กœ ๋Œ€์ฒดํ•˜๊ณ  ๋Œ€์ฒด๋œ ์ฝ”๋“œ๋ฅผ PEG.js๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

integers.pegjs

integers=[0-9]* {return parseInt(text())}

main.pegjs
arrayOfInteger="["(integers ",")* integers"]"
@load("integers.pegjs")

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹œ์ž‘ ๋ฌธ๋ฒ•์„ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  @load ๋ฅผ "arrayOfInteger" ์•ž์— ๋ฐฐ์น˜

์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋™์ผํ•œ ์ด๋ฆ„์˜ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์‹œ์ž‘ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์ƒˆ ์• ๋“œ์˜จ์ด ์ˆ˜๋™์œผ๋กœ ์‹œ์ž‘ ์†์„ฑ์„ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ๊ตฌ์„ฑํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ๋์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋Œ€์ฒดํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  ๋ณต์ œ์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์ฃผ๋กœ ์ตœ์ ํ™” ์š”์ฒญ์ด๋ผ๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ฉ์„ฑ ๊ฐ€๋Šฅ์„ฑ/๋ชจ๋“ˆ์„ฑ์€ ํŠนํžˆ ๋ฌธ๋ฒ•์˜ ์ „์ฒด ์ŠคํŽ™ํŠธ๋Ÿผ์„ ์ œ์–ดํ•  ๋•Œ ์Šค์Šค๋กœ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

1k ๋ผ์ธ ๊ธธ์ด์˜ ๋ฌธ๋ฒ•์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ๋ถ„ํ• ํ•˜๊ณ  pegjs์— ํŽŒํ•‘ํ•˜๊ธฐ ์ „์— ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋Œ€๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜์‹ญ์‹œ์˜ค.

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