๋ค๋ฅธ ๋ฌธ๋ฒ์์ ๊ท์น์ ๊ฐ์ ธ์ ๋ฌธ๋ฒ์ ์ ์ํ๋ ๊ธฐ๋ฅ์ ๊ฐ๋ ๊ฒ์ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์์ด๋์ด ;
<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๋ฅผ ๋ฐํํฉ๋๋ค. - ๋จ์ํ ์ต์
๋งค๊ฐ๋ณ์๋ฅผ ์์ ํ๋ ๊ฒ์ผ๊น์?).
๊ทธ๊ฒ์ ๋ฌธ๋ฒ์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ฝ๋์ ๋ชจ๋ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋ฉ์ ๋ ๊ฐ์ง ๋งค์ฐ ์ค์ํ ์ธก๋ฉด์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ค์ํ ๊ธฐ๋ฅ์ด๋ผ๋ ์ ์ ๋์ํ๊ณ 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์ ์ ์ฌํฉ๋๋ค. ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ถฉ๋์ ํผํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋ณด๋ ๋ ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค.
<name> = require(<module>)
๊ตฌ์กฐ๋ ๊ท์น ์ ์์ ๋๋ฌด ์ ์ฌํ์ฌ ํผ๋๋ ์ ์์ต๋๋ค(ํ๋์ ๊ท์น๋ง ๊ฐ์ ธ์จ ๊ฒ์ผ๋ก ์๊ฐํ ์ ์์)..
๊ตฌ๋ฌธ์ "๋ชจ๋ ๋ฌธ์"์ธ .
์ ํ์ฌ ์๋ฏธ์ ์ถฉ๋ํฉ๋๋ค. ์ด๊ฒ์ ์ถ์
ํ ํดํน(์: ๊ณต๋ฐฑ์ผ๋ก ๋๋ฌ์ธ์ธ .
์ "๋ชจ๋ ๋ฌธ์"๋ฅผ ์๋ฏธํ๋ ๋ฐ๋ฉด ์๋ณ์๋ก ๋๋ฌ์ธ์ธ .
์ ๊ท์น ์ด๋ฆ์์ ๋ค์์คํ์ด์ค ์ด๋ฆ์ ๋ถ๋ฆฌํจ) ๋๋ ๊ตฌ๋ฌธ ๋ณ๊ฒฝ(์: 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=[0-9]* {return parseInt(text())}
arrayOfInteger="["(integers ",")* integers"]"
@load("integers.pegjs")
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋๊ตฐ๊ฐ๊ฐ ์์ ๋ฌธ๋ฒ์ ์ ์ํ์ง ์๊ณ @load ๋ฅผ "arrayOfInteger" ์์ ๋ฐฐ์น
์ด๋ฅผ ์ฒ๋ฆฌํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋์ผํ ์ด๋ฆ์ ํ์ผ ์ด๋ฆ๊ณผ ์์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ณ ์ ์ ๋์จ์ด ์๋์ผ๋ก ์์ ์์ฑ์ ํ์ผ ์ด๋ฆ์ผ๋ก ๊ตฌ์ฑํ๋๋ก ํ๊ฑฐ๋ ํ์ผ ๋์ ๋ชจ๋ ๋ด์ฉ์ ๋์ฒดํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ ๋ ์ด ๋ฌธ์ ๊ฐ ์ฃผ๋ก ์ต์ ํ ์์ฒญ์ด๋ผ๋ ์ ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ฉด ํฉ์ฑ ๊ฐ๋ฅ์ฑ/๋ชจ๋์ฑ์ ํนํ ๋ฌธ๋ฒ์ ์ ์ฒด ์คํํธ๋ผ์ ์ ์ดํ ๋ ์ค์ค๋ก ๋ฌ์ฑํ ์ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
1k ๋ผ์ธ ๊ธธ์ด์ ๋ฌธ๋ฒ์ด ๋ง์์ ๋ค์ง ์์ผ๋ฉด ๋ถํ ํ๊ณ pegjs์ ํํํ๊ธฐ ์ ์ ์ ์ ํ๋ค๊ณ ์๊ฐ๋๋ ๋๋ก ๋ค์ ์ฐ๊ฒฐํ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@Dignifiedquire ํ์ฌ ์๋ฅผ ๋ค์ด ๊ฐ์ฅ ์ ์ค๋ช ํ ์ ์๋ ๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ ์ฒด๊ณ์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค.
์ ์ ์ธ์ด.pegjs
๋์ ์ธ์ด.pegjs
๋ชจ๋ ์ธ์ด.pegjs
๊ฐ
.pegjs
ํ์ผ์ ํฌํจ๋ ๋ชจ๋ ๊ท์น์ ๋ด๋ณด๋ด๋ ๋ชจ๋์ ์์์ ์ผ๋ก ์ ์ํฉ๋๋ค.<name> = require(<module>)
๊ตฌ๋ฌธ์ ์ด๋ฌํ ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ํด๋น ๊ท์น์ ๋ค์์คํ์ด์ค ๋ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ด ๋์์ธ์ ์๋์ ์ผ๋ก Node.js์ ์ ์ฌํฉ๋๋ค. ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ถฉ๋์ ํผํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋ณด๋ ๋ ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค.
<name> = require(<module>)
๊ตฌ์กฐ๋ ๊ท์น ์ ์์ ๋๋ฌด ์ ์ฌํ์ฌ ํผ๋๋ ์ ์์ต๋๋ค(ํ๋์ ๊ท์น๋ง ๊ฐ์ ธ์จ ๊ฒ์ผ๋ก ์๊ฐํ ์ ์์)..
๊ตฌ๋ฌธ์ "๋ชจ๋ ๋ฌธ์"์ธ.
์ ํ์ฌ ์๋ฏธ์ ์ถฉ๋ํฉ๋๋ค. ์ด๊ฒ์ ์ถ์ ํ ํดํน(์: ๊ณต๋ฐฑ์ผ๋ก ๋๋ฌ์ธ์ธ.
์ "๋ชจ๋ ๋ฌธ์"๋ฅผ ์๋ฏธํ๋ ๋ฐ๋ฉด ์๋ณ์๋ก ๋๋ฌ์ธ์ธ.
์ ๊ท์น ์ด๋ฆ์์ ๋ค์์คํ์ด์ค ์ด๋ฆ์ ๋ถ๋ฆฌํจ) ๋๋ ๊ตฌ๋ฌธ ๋ณ๊ฒฝ(์:any
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ "๋ชจ๋ ๋ฌธ์"๋ฅผ ๋ํ๋).