์๋ฏธ๋ก ์ ํ๋์ ๋ํ ์ฝ์นญ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด { return value }
๋ฅผ ์ฐ๋ ๋์ ์ด๋์
๋ผ์ด์ ์ ์ ์๋ { extract }
๋ฅผ ์๋๋ค.
์๋ฅผ ๋ค์ด:
{
function extract(value) {
return value;
}
function concat(head, tail) {
return head ? [head].concat(tail) : [];
}
function toAddExpr(head, tail) {
return { type: 'addExpr', expressions: concat(head, tail) };
}
}
List
= '(' _ head:Item? tail:( _ ',' _ value:Item { extract } )* _ ')' { concat }
// Another kind of list
Add
= '(' _ head:Multiply? tail:( _ '+' _ value:Multiply { extract } )* _ ')' { toAddExpr }
์ฒซ์งธ, ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํด์ค ๊ฒ์
๋๋ค... ๋ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก :smile:
๋์งธ, ์ด๊ฒ์ ๋ฌธ๋ฒ์ ์ข ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ๊ฒ์
๋๋ค.
๋ํ ์ก์
์๊ธฐ์ ํฌํจ๋ ํํ์์ด ์๋ณ์ { foo }
๋์ ๋ฉค๋ฒ ํํ์ { foo.bar.baz }
๋ ๋ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ๋ฌธ๋ฒ ์์ฑ์๋ ๊ฐ์ฒด ๋๋ ๋ชจ๋ ๋ด๋ถ์์ ๊ธฐ๋ฅ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ์ด ํจ์์ ์ ๋ฌ๋๋ ์ธ์๊ฐ ๋ช ํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋ช ํํ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ํ "์ฌ์ฉ์ ์ ์" ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ ํจ์ ํธ์ถ๊ณผ ํผํฉํด์ผ ํ๋ฏ๋ก ๊ฐ๋จํ ๊ฒฝ์ฐ์ฒ๋ผ ๊นจ๋ํด ๋ณด์ด์ง ์์ต๋๋ค.
#235์ ๋๊ตฐ๊ฐ๊ฐ =>
๊ตฌ๋ฌธ์ ํ์ดํ ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ ์ํ๋๋ฐ, ์๋นํ ๊น๋ํ๊ณ ๊ฐ๊ฒฐํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
= '(' expr:some_expression ')' => expr
;
์ ๋ ์๊ธฐ ๊ตฌ๋ฌธ์ ๋ํด ๋ค์ ์ค ํ๋๋ฅผ ์ ํํ๋ ค๊ณ ํฉ๋๋ค.
=> expr;
_(๊ตฌ๋ฌธ ์ง์ ํ์)_{ => expr }
_(์ง๊ธ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ํฌ์ฅ์ ํ์ด์ผ ํจ)_{ > expr }
_(๊ตฌ๋ฌธ ์ง์ ํ์)_์์ง ๊ฒฐ์ ๋์ง ์์์ผ๋ฏ๋ก ๋ ผ์๋ฅผ ์ํด ์ด๋ ค ์์ต๋๋ค.
OP๊ฐ ์ํ๋ ๊ฒ์ ๊ดํด์๋ Acorn ๋๋ @babel/parser๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณ์ ๋๋ ๋ฉค๋ฒ ํํ์์ ๋ํ์ ํ๊ณ ํธ์ถ ํํ์์ผ๋ก ๋ณํํ๋ ํ๋ฌ๊ทธ์ธ์ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๋ ์ด๋ธ์ ์ธ์๋ก ์ฌ์ฉํ๊ณ ์์ฑ๋ ์ฝ๋๋ฅผ ๋ฐํํฉ๋๋ค.
=> expr;
๋ด ์๊ฒฌ์ผ๋ก๋ ์ต๊ณ .
{ => expr }
Javascript ๊ตฌ๋ฌธ IMO์ ์ถฉ๋ํฉ๋๋ค. {
}
์์ผ๋ฏ๋ก ์ ์ฒด ํ์ดํ ํจ์( () =>
)
{ > expr}
PegJS ๋๋ Javascript์ ๋ค๋ฅธ ๊ตฌ๋ฌธ๊ณผ ์ฝ๊ฐ ์ง๊ตํ์ง๋ง ์ฃผ๋ก ์ค๊ดํธ ์์ ์๊ธฐ ๋๋ฌธ์ "์ด๋ ๊ฐ์ ๋ฐํํ๋ ์ฝ์" IMO๋ฅผ ์ฆ์ ์ฝ์ง ์์ต๋๋ค. {=> expr}
์ ๊ฐ์ ์ธ์ , Javascript๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๋ํ {}
์ non-JS ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ตฌ๋ฌธ ํ์ด๋ผ์ดํฐ, ๋ฆฐํฐ ๋ฑ์ ๋ฌธ์ ์
๋๋ค. ์ ๋ ๋ฐ๋ํฉ๋๋ค.
๋ด๊ฐ ๋ ๋ค๋ฅธ ์ต์
์ ์ ์ํ ์ ์๋ค๋ฉด ์๋ง๋ >
์์ฒด(์ ์ด ๋ธ๋ก ๋ด๋ถ๊ฐ ์๋)์ผ ๊ฒ์
๋๋ค. ๊ท์น์ ์ธ๋ก๋ก ๋ฐฐ์นํ ๋ ์ ๋ ฌ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
= foo:bar qux:(' '+ @qix)+
> {foo, qux}
;
๋ฟ๋ง ์๋๋ผ ์ธ๋ผ์ธ
some_rule = foo:bar qux:(' '+ @qix)+ > {foo, qux};
'=>'์ ์ธ๋ฏธ์ฝ๋ก ์ด ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์๋ฅผ ๋ค์ด buildList()๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ค์ฒฉ ์ฝ๋์์ ๊ฐ์ ๋ฐํํ๊ณ ์ถ์ต๋๋ค.
= "(" _ head:Expression _ tail:("," _ expr:Expression => expr)* ")" {
return [head, ...tail]
}
๋งค์ง ์ธ๋ฑ์ค(์๋)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ด๊ฒ์ด ๋ ๊น๋ํฉ๋๋ค. ๋ ๋ค๋ฅธ ์ต์
์ ์ค์ฒฉ ๋ ์ด๋ธ์ ์ฐธ์กฐํ๋ ๊ธฐ๋ฅ์
๋๋ค. ์: ("," _ tail:Expression)* ")"
= "(" _ head:Expression _ tail:("," _ Expression)* ")" {
return buildList(head, tail, 2)
}
parser.pegjs๋ฅผ ๋ณด๊ณ ์์๋๋ฐ 434ํ ์ฃผ์์ CodeBlock์ด ์๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๊ทธ๊ฒ์ ์๋ํ๋ ค๋ฉด ๋ฌด์์ํด์ผํฉ๋๊น? ๊ท์น ์ฝ๋๋ ๋จ์ํ '.'์ธ SourceCharacter๋ฅผ ์ฝ์ต๋๋ค.
CodeBlock "code block"
= "=>" __ <strong i="13">@Code</strong> // this?
/ "{" <strong i="14">@Code</strong> "}"
@mikeaustin ๋ค, ๋ง์ต๋๋ค. ํ์ง๋ง ์ด ์ํ์ค๋ฅผ ๋๋ผ ์์น๋ฅผ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก =>
์ดํ์ ๋ชจ๋ ๊ฒ์ ์๋นํฉ๋๋ค.
"์ฝ๋"๊ฐ ๋๊ดํธ์ ์ค๊ดํธ์ ๊ท ํ์ ๋ง์ถ๊ณ LineTerminator๋ฅผ ์ฒ๋ฆฌํ๋ ์ข ๋ ๋๋ํ ์ ์์๊น์? ์ ์ฒด JavaScript์ ๋ํด ์ ํ์๋ ์์ง๋ง ์๊ฐ๋ณด๋ค ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์ฌ์ค, ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํจ๊ณผ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
CodeBlock "code block"
= "=>" _ expession:CallExpression {
return `return ${ expession };`;
}
/ "{" <strong i="6">@Code</strong> "}"
/ "{" { error("Unbalanced brace."); }
// Will be based on ECMAScript's CallExpression
CallExpression
= ...
/ MemberExpression
// Will be based on ECMAScript's MemberExpression
MemberExpression
= ...
/ ValidIdentifier
// Change `LabelIdentifier` into `ValidIdentifier`
์ด ๋ฐฉ๋ฒ์ ์ฌ์ ํ โโECMAScript์ ๊ธฐ๋ณธ ํํ์(์ซ์, ๋ถ์ธ, ๋ฐฐ์ด ๋ฑ)๊ณผ ๊ฐ์ ์ผ๋ถ ํญ๋ชฉ์ ์ธ์๋ก ์ฌ์ฉํ์ฌ ํตํฉํด์ผ ํ๋ฏ๋ก ์ถ๊ฐํ ํญ๋ชฉ์ ์ ์คํ๊ฒ ํ์ ํด์ผ ํฉ๋๋ค.
๊ท ํ ๋ธ๋ํท ๋ฐ ์ค๊ดํธ
์ด๊ฒ์ ์ ์ ํ JavaScript ํ์๊ฐ PEG.js ํ์์ ๋ด์ฅ๋ ๋๊น์ง ์์ ๋์ง ์์ ๊ฒ์ด์ง๋ง, ์์งํ ๋งํด์ ๋ค๋ฅธ ์ธ์ด(C, PHP, TypeScript ๋ฑ), ๊ทธ๋ฆฌ๊ณ ์ธ์ ๊ฐ๋ ํ์๋ฅผ ์์ฑํ ์ ์๋ ์ปดํจํฐ ์ธ์ด๋ ์์ ํ๊ณ ์์ต๋๋ค.
_PEG.js์ด v0.12_ ์ธ์๋, ๋๋์ ์์ ํ OpenPEG ์ถฉ๋ถํ ๊ธฐ๋ฅ์ด ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์๋ฐ ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์๋๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ ๋ ์๋ฐ ์คํฌ๋ฆฝํธ ํ์ ๋ฐ์ํ์ง ์๊ณ PEG.js์ ๋ฒ์ ์ ๋ฐํ ์ธ NPM ํจํค์ง๋ฅผ ์ ๊ณต ํ ๊ฒ์ด๋ค,ํ์ง๋ง, PEG.js๋ ๋ฐฑ์๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. _v0.12_๊ฐ ๋์ค๋ฉด ์ปค์คํ ํ์๋ฅผ ์์ฑํ๋ ๋ชจ๋ ํ๋ฌ๊ทธ์ธ ํ๋ก์ ํธ์ OpenPEG์ ๋ํ ์๋ฆผ์ ์ ๊ณตํ๊ณ v1 ์ด์ ์ ์ ์ฒด ECMAScript 2015 ํ์๋ฅผ PEG.js ๋ฌธ๋ฒ ํ์์ ๊ตฌํํ๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.
FWIW, ๋๋ ์ด๊ฒ์ ์ํด ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๋ค. ๋ํ ๋ด ํ ์คํธ ํธ์ง๊ธฐ์์ JS์ ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์๋ฅผ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค...
exports = module.exports = functionBodies`${grammarScript}
...
objectText =
head:word
rest:(_txt_ word)*
${f=>{
return new Txt(rest.reduce((a,b)=>([...a,...b]),[head]))
}}
word = ch:(wordCharacter/escapedCharacter)+ ${chJoin}
...
`
function functionBodies(glue, ...fns){
return glue.map( (str,i) => str + (fns[i]||'').toString().replace(/^[^{]*/,'').replace(/[^}]*$/, '') ).join('')
}
function chJoin(ch){return ch.join('')}
์ ์๋ ํ์ดํ ์ฐ์ฐ์(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Pipeline_operator)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ ํ์ดํ๋ฅผ ์์ฒญํ๊ธฐ ๋๋ฌธ์?
{
function extract(value) {
return value;
}
function concat(head, tail) {
return head ? [head].concat(tail) : [];
}
function toAddExpr(head, tail) {
return { type: 'addExpr', expressions: concat(head, tail) };
}
}
List
= '(' _ head:Item? tail:( _ ',' _ value:Item |> extract )* _ ')' |> concat
// Another kind of list
Add
= '(' _ head:Multiply? tail:( _ '+' _ value:Multiply |> extract )* _ ')' |> toAddExpr
์ด๋ฐ ์ผ์ด ์ผ์ด๋์๋ ์ ๋ฉ๋๋ค. ์งง์ ๊ตฌ๋ฌธ์ด ์์ด์ผ ํฉ๋๋ค.
ํ์ดํ๋ฅผ ์์ผ๋ก ๋ผ์ฐ๋ ค๊ณ ํ๋ ๋์ ์ ์์ ์ผ๋ก ํ์ดํ๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒฝ์ฐ์๋ ์ด ์ค ์ด๋ ๊ฒ๋ ํ์ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ๊น๋ํ ์์ด๋์ด์ด์ง๋ง JavaScript์ ๋นํด ๊ด๋ฒ์ํ ๋ฌธ๋ฒ ๋ชจํธ์ฑ์ ์ค์ ํฉ๋๋ค. JS๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ with
์ฌํ๊ฐ ๋ฌด์์ธ์ง ๊ธฐ์ตํ๋ ์ฌ๋์ ์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์๋ฅผ ์ฃฝ์ผ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ฉ์ง ์ ๊ฒ์ ๋ง๋ค๋ ค๊ณ ํ๋ ๋์ Javascript๋ฅผ ์ง์ํด์ผ ํฉ๋๋ค. ํ์ดํ ํจ์๋ ES6๋ณด๋ค ์ค๋๋ ๊ฒ์ด๊ณ ES6์ 2015๋ ๋ถํฐ์ ๋๋ค. ์ด๊ฒ์ 6๋ ์ ์ ํด๊ฒฐ๋์์ต๋๋ค. ์ฌ๊ธฐ์ ์ด๋ค ๋ฐ๋ช ๋ ์ผ์ด๋์๋ ์ ๋ฉ๋๋ค.
ํ์ดํ ์ฐ์ฐ์๋ ์ฌ๊ฐํ ๊ฒฐํจ์ด ์์ผ๋ฉฐ ์๋ง๋ ์ค์ ๋ก Javascript๋ก ๋ง๋ค์ง ๋ชปํ ๊ฒ์ ๋๋ค. ํ์ดํ ์ฐ์ฐ์๊ฐ ์๋ ํ์๋ ์ธ์ด(F#)์ ์ด๋ฅผ ๋์คํํ ์ธ์ด(Elixir)๋ ๋ชจ๋ ์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ด๊ฒ์ ์ด๋ค ์๋ฏธ์์ ๋ฐฐ๊ด์ด ์๋๋๋ค.
PEG๊ฐ ๊ทธ๋ ๊ฒ ์ฑ๊ณต์ ์ธ ์ด์ ๋ ๊ทธ๊ฒ์ด ์ต์ํ๋๊ณ ์ธ์ด์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ณ ์์ผ๋ฉฐ ์์ธก ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ดํ ํจ์๋ ES6๋ณด๋ค ์ค๋๋ ๊ฒ์ด๊ณ ES6์ 2015๋ ๋ถํฐ์ ๋๋ค. ์ด๊ฒ์ 6๋ ์ ์ ํด๊ฒฐ๋์์ต๋๋ค. ์ฌ๊ธฐ์ ์ด๋ค ๋ฐ๋ช ๋ ์ผ์ด๋์๋ ์ ๋ฉ๋๋ค.
์. ๊ทธ๊ฒ์ ๋์๊ฒ ์๋ก์ด ์์์ด๋ค. ํ์ฅํ ์๊ฐ?
PEG๊ฐ ๊ทธ๋ ๊ฒ ์ฑ๊ณต์ ์ธ ์ด์ ๋ ๊ทธ๊ฒ์ด ์ต์ํ๋๊ณ ์ธ์ด์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ณ ์์ผ๋ฉฐ ์์ธก ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
PEG(์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ ๊ฐ๋ ์ผ๋ก)๊ฐ ์ฑ๊ณตํ ์ด์ ๋ ๋ณต์กํ ๋ฌธ๋ฒ(์ฌ๊ท ๋ฑ)์ ๋จ์ํ ๋ฐฉ์์ผ๋ก ํํํ๋ ๋ฅ๋ ฅ ๋๋ฌธ์ ๋๋ค. Packrat์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ๋ช ๋์ง ์์์ต๋๋ค. ๊ตฌ๋ฌธ์ด ์๋๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
ํ์ดํ ํจ์๋ ES6๋ณด๋ค ์ค๋๋ ๊ฒ์ด๊ณ ES6์ 2015๋ ๋ถํฐ์ ๋๋ค. ์ด๊ฒ์ 6๋ ์ ์ ํด๊ฒฐ๋์์ต๋๋ค. ์ฌ๊ธฐ์ ์ด๋ค ๋ฐ๋ช ๋ ์ผ์ด๋์๋ ์ ๋ฉ๋๋ค.
์. ๊ทธ๊ฒ์ ๋์๊ฒ ์๋ก์ด ์์์ด๋ค. ํ์ฅํ ์๊ฐ?
๋๋ ๋น์ ์ด ๋ฌด์์ ๋ฌป๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ์ดํ ํจ์๋ ES6๋ณด๋ค ์ค๋๋์์ต๋๋ค. ์ด๊ฒ์ ES6์์ ๋ ๋ฒ์งธ๋ก ํฐ ์ธ์์ด์๊ณ , ES4๋ฅผ ํ์ ์ํจ ๊ฒ๊ณผ ES5+๋ฅผ ํ์ ์ํจ ๊ฒ์ ๋๋ค. 90๋ ๋ ์ค๋ฐ๋ถํฐ ๋ชจ๋ ์ฌ๋๋ค์ด ๊ทธ ์์ ์์ E4X์ ์ด๋ฏธ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ๋ค์ ์๊ตฌํด ์์ผ๋ฉฐ, ๊ตฌ๊ธ๊ณผ ์ ํ์ด ๋ง์ดํฌ๋ก์ํํธ๊ฐ ๋ฌด์์ด๋ ๋ฐ๋ช ํ ์ ์ด ์๋ค๊ณ Hixie๋ฅผ ๋น๋ํ๊ธฐ ๋๋ฌธ์ ์ ๊ฑฐ๋์์ต๋๋ค.
์ด์ E4X๋ฅผ React๋ก ์๊ณ ์๊ณ Facebook์ด ๊ทธ๊ฒ์ ๋ฐ๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ด์ค๋ถ์ ํ์ดํผ์คํฌ๋ฆฝํธ๋ฅผ ๋์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Hyperscript ์ฌ๋์ ๊ทธ๊ฐ ์ด์ IE์์ ์ ์ฉํ ๊ฒ์ ๋ค์ ๊ตฌํํ๊ณ ์๋ค๋ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค.
ํ ํ๋ฆฟ ๋ฌธ์์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ES6์์ ์์ ํ ์ ์ธ๋ ์์ ์ด์์ง๋ง Coffeescript๊ฐ ๋ฑ์ฅํ์ฌ JS ์ปค๋ฎค๋ํฐ์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ ๊ณตํ์ผ๋ฉฐ JS ์ปค๋ฎค๋ํฐ๋ ECMA ์ฌ๋๋ค์ด ์์ง์ผ ๋๊น์ง ์๋ฆฌ์ณค์ต๋๋ค. 18๊ฐ์๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์๋ค
ํ์ดํ ํจ์๋ ์ฌ๊ธฐ์์ ๋ฐ์ํ๋ ๋ชจ๋ ์์ ์ ์ํํฉ๋๋ค. 2018๋ ์ ์ด ์ค๋ ๋์์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ์ฌ๋์ด ๋ฐ๋ก ๋น์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋น์ ์ ์ง์ํ๋ ค๊ณ ํ์ต๋๋ค.
๋์๊ฒ ๋ ์ค์ํ ๊ฒ์ ํ์ดํ ๊ธฐ๋ฅ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ฌด๊ฒ๋ ์ถ๊ฐ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
JS์ Peg์ ์ฐจ์ด์ ์ ์ ๋์ ์ผ๋ก ๋ฏธ๋ฏธํฉ๋๋ค. ES6 ์์ ์ ์ํํ์ฌ ์ด๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ๋ชฉ๋ก์ด ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๊ฒ์ ๋งค์ฐ ๊ฐ์น ์๋ ์ผ์ ๋๋ค.
PEG(์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ ๊ฐ๋ ์ผ๋ก)๊ฐ ์ฑ๊ณตํ ์ด์ ๋ ๋ณต์กํ ๋ฌธ๋ฒ(์ฌ๊ท ๋ฑ)์ ๋จ์ํ ๋ฐฉ์์ผ๋ก ํํํ๋ ๋ฅ๋ ฅ ๋๋ฌธ์ ๋๋ค.
๋์ํ์ง ์์ต๋๋ค. ๋ง์ ํ์๊ฐ ์ด๊ฒ์ ๋ํด ํจ์ฌ ๋ ์ ์ํํ๋ฉฐ ๊ทธ๋ค์ ๋ํด ์๋ ์ฌ๋๋ค(Earley์ ๊ฐ์)์๊ฒ๋ ์ฝ๊ฐ ์ธ๊ธฐ๊ฐ ์์ต๋๋ค.
์ ํต์ ์ธ ์ค๋ช ์ ์ค๋ฅ ๋ฉ์์ง ํ์ง๊ณผ ์๋์ ์กฐํฉ์ด์ง๋ง, ๋ง์ ํ์๊ฐ ๋ ๋์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ ๋นจ๋ฆฌ ๊ฐ์ง๊ณ ์๊ณ (Earley์ ๊ฐ์ด) ์ฌ๋๋ค ์ฌ์ด์์๋ ์ฝ๊ฐ ์ธ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ๋ ๋์ํ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ๋ํด ์๋ ์ฌ๋
๋ํ PEG์๋ ์ธ ๊ฐ์ง ์ฌ๊ฐํ ๋ณต์ก์ฑ ํ๊ณ๊ฐ ์์ต๋๋ค.
์ฒซ์งธ, ํ๊ทธ ๋ฌธ๋ฒ์ ํตํด ์ ๋ ฅํ๋ ค๋ ๋ชจ๋ ํญ๋ชฉ์๋ ๋ก์ปฌ ์์คํ ์ ์บ์ ๋ฐ ํ๊ฐ ์ฒ๋ฆฌ๋์ ์๋ํ์ง ์๋ ์กฐํฉ ํํ์์ด ์์ด์ผ ํฉ๋๋ค(์์ #623).
๋ ๋ฒ์งธ, BNF ๊ตฌ๋ฌธ ๋ถ์๊ณผ ๊ฐ์ ๋ง์ ์ผ๋ฐ์ ์ธ ์์ ์ ์ข ์ข peg์์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค(์์ #489).
์ธ ๋ฒ์งธ, ํจ์ฌ ๋ ๊ฐ๋ ฅํ ๋ชจ๋ ๋ค๋ฅธ JS PEG ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์คํจํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋๋ ์ฌ๋ฌ ๋ฒ ์ ํํ๋ ค๊ณ ์๋ํ๊ณ ๋์ ์์ต๋๋ค. ํนํ, c
, ruby
๋ฐ python
๋ฅผ ์ถ๊ฐ๋ก ํ๊ฒํ
ํ ์ ์๊ธฐ ๋๋ฌธ์ canopy
๋ก ์ ํ์ ์ฌ๋ฌ ๋ฒ ์๋ํ์ต๋๋ค. javascript
๋ฌผ๋ก ์ ๊ฐ ๋งํ ์ ์๋ ๊ฒ์ ์ด ์ ํ์ ์ฌ์ฉํ๊ณ ์๋ 24๋ช ์ ๋์ ์ฌ๋๋ค๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ํ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ๋ฉฐ์น ์ ์ ์๋ก์ด ๋น ์ ์ง ๊ด๋ฆฌ์๊ฐ ์ํํธ์จ์ด๋ฅผ ๋ฒ๋ฆฌ๊ณ ๋ช ๋ ๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ๊ฒ์๋์ง ์์ ํ ์ฒ์๋ถํฐ ๋ง๋ ๊ฒ์ผ๋ก ๊ต์ฒดํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ ๋
ํ์ง๋ง ๊ทธ๋ค ๋ชจ๋๋ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ค๋ฒํค๋๊ฐ ๋ง์ง ์์ ํ์๊ฐ ํ์ํ๊ฑฐ๋ ๋์์ด ์ ๋ขฐํ ์ ์๋ ๋น ๋ฅด๊ณ ์์ ๋ฌด์ธ๊ฐ๊ฐ ํ์ํ๋ค๊ณ ๋์๊ฒ ๋งํ์ต๋๋ค.
์ถ์๋์ง ์์ 0.11์ ๋ ธ๋ ๋ ํฌ๋กฌ์์ ์๋ฏธ ์๊ฒ ๋ค๋ฅด๊ฒ ์๋ํ๋ฉฐ ๋ ธ๋๋ ํฌ๋กฌ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ๋ช ๊ฐ์ง ์์ฑ ํ ์คํธ๋ฅผ ์์ฑํด ๋ณด์ญ์์ค. ์์งํ ์ข ๋ฌด์ญ์ต๋๋ค.
.
Packrat์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ๋ช ๋์ง ์์์ต๋๋ค. ๊ตฌ๋ฌธ์ด ์๋๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๋ ํฉ๋ซ์ ๋ํด ์๋ฌด ๋ง๋ ํ์ง ์์์ด, ์น๊ตฌ. ๋ฌด์์ ์์ ํ๋ ค๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ Packrat ๊ตฌ๋ฌธ ๋ถ์์ ์ ๋ ฌ์ด ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋๋ค. Packrat ๊ตฌ๋ฌธ ๋ถ์์ ์์ ์ด๋ฉฐ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ค์ ๋ก, ๋๋ถ๋ถ์ ์๊ฐ Haskell ์ฑ ์ ๋น์ ์ด 3-4๊ฐ์ ๋ค๋ฅธ packrat ํ์๋ฅผ ํ๊ฒ ๋ง๋ญ๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ๋ค์ ๋ชจ๋๋์ ๋ํ haskell์ ์ ๊ทผ ๋ฐฉ์์ ์ฑ๋ฅ ๋ฌธ์ ์ ์ ๋ง๋ก ๋งค๋ฌ๋ฆด ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. packrats(์ฆ, ์๊ณ ๋ฆฌ์ฆ ๋ณ๊ฒฝ)๋ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ถํฉ๋๋ค.
.
๊ทธ ์์ง์๊ฐ๋ฝ์ ๋ค์ ์๊ฐํ์๊ธฐ ๋ฐ๋๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฃฝ์ ์ง 3๋ ์ด ๋์๋๋ฐ ์ง๊ธ ๋ค์ ๋ถํ์ํค๊ณ ์ถ์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฃฝ์ ์ด์ ์ค ์ผ๋ถ๋ ์ฌ๋๋ค์ด 2๋
๋์ dev์ ์๋ es()
๋ชจ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ๋จํ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์ํํ๋ ๋์ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ธฐ ์ํด ๊ณ์ ์๋ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ผ์ธ์ ์๋ฅด๊ณ ์์ผ๋ก ์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋์ ์คํ ์ดํ๋งํ์ฌ PEG ํ์๋ฅผ ์๋์ผ๋ก ์์ ํด์ผ ํฉ๋๋ค.
๋ณ์ด ๋น๋๋ ๋์ ์ ์ ๋์ ๊ฐ๊ณ ์ค์ฉ์ ์ธ ๊ธฐ๋ฆ๊ธฐ ๋ง์ ํ๊ฟ์น๊ฐ ์์๋์ด์ผ ํฉ๋๋ค. PEG๋ ์ฌ์ฉ์ด ๊ฐ์ํ๋ฉด์ ๋ด๊ฐ ๋ณธ ์ ์ผํ ์ฃผ์ NPM ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ํฉ๋ฆฌ์ ์ธ ๋์์ ์์ง ๋ชปํ๋ค๋ ์ ์ ๊ฐ์ํ ๋, ๊ทธ๊ฒ์ ๋์๊ฒ ์ด์ํ๊ณ ํผ๋์ค๋ฝ์ต๋๋ค.
์ง๊ธ ๋น์ฅ ๊ธฐ์ฌํ๊ณ ์ถ์ ๋ฒ๊ทธ ์์ ์ด ์์ง๋ง ํ ์ ์์ต๋๋ค.
0.10
์ dmajda๊ฐ ๋ ๋ ํ ๊ฒ์๋์ง ์์์ต๋๋ค.0.11
์(๋) 3๋
๋์ ๋ฐํ๋ ์ ์ด ์์ผ๋ฉฐ ํ ๋ฌ ์ ์ ๋ฐํ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋ฐํ๋์์ต๋๋ค.0.12
๋ peg๊ฐ ์๋๋ผ ๋ค๋ฅธ ์ฌ๋์ด ์ฒ์๋ถํฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ ๊ฒ์ด๋ฏ๋ก ์๋ฌด๋ ๋ณผ ์ ์์ต๋๋ค.๋ฌด๋กํ๋ค๋ ๊ฑด ์์ง๋ง ์ฐ๋ฆฌ๋ ์ด ๋์๊ด์ด ์ฃฝ์ด๊ฐ๊ณ ์๋ค๋ ์ฌ์ค์ ์ง์ํด์ผ ํฉ๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค์ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๊ฒ ๋๋ค๋ฉด ์ ์์ ์ธ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๋ฐ์๋ค์ฌ์ผ ํ ๋์ ๋๋ค. 2020๋ ์ ๋๋ค. 2017๋ ์ดํ๋ก ์๋ฌด๊ฒ๋ ๋ณด์ง ๋ชปํ์ต๋๋ค.
์๋์, dev ๋ถ๊ธฐ๋ ๊ณ์ฐ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ 0.11
์ ํ์ง์ด ์ถฉ๋ถํ์ง ์๊ณ 10
์์ ๋ค์ ์์ํ๋ ๊ฒ์ด 11
์์ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ ์ ์์
์ด๊ธฐ ๋๋ฌธ์ ์ ์ ์ง ๊ด๋ฆฌ์๋ ๋ง์ ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด์ผ ํฉ๋๋ค 10
11
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ์ค, ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํจ๊ณผ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ ํ โโECMAScript์ ๊ธฐ๋ณธ ํํ์(์ซ์, ๋ถ์ธ, ๋ฐฐ์ด ๋ฑ)๊ณผ ๊ฐ์ ์ผ๋ถ ํญ๋ชฉ์ ์ธ์๋ก ์ฌ์ฉํ์ฌ ํตํฉํด์ผ ํ๋ฏ๋ก ์ถ๊ฐํ ํญ๋ชฉ์ ์ ์คํ๊ฒ ํ์ ํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ ์ ํ JavaScript ํ์๊ฐ PEG.js ํ์์ ๋ด์ฅ๋ ๋๊น์ง ์์ ๋์ง ์์ ๊ฒ์ด์ง๋ง, ์์งํ ๋งํด์ ๋ค๋ฅธ ์ธ์ด(C, PHP, TypeScript ๋ฑ), ๊ทธ๋ฆฌ๊ณ ์ธ์ ๊ฐ๋ ํ์๋ฅผ ์์ฑํ ์ ์๋ ์ปดํจํฐ ์ธ์ด๋ ์์ ํ๊ณ ์์ต๋๋ค.
_PEG.js์ด v0.12_ ์ธ์๋, ๋๋์ ์์ ํ OpenPEG ์ถฉ๋ถํ ๊ธฐ๋ฅ์ด ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์๋ฐ ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์๋๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ ๋ ์๋ฐ ์คํฌ๋ฆฝํธ ํ์ ๋ฐ์ํ์ง ์๊ณ PEG.js์ ๋ฒ์ ์ ๋ฐํ ์ธ NPM ํจํค์ง๋ฅผ ์ ๊ณต ํ ๊ฒ์ด๋ค,ํ์ง๋ง, PEG.js๋ ๋ฐฑ์๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. _v0.12_๊ฐ ๋์ค๋ฉด ์ปค์คํ ํ์๋ฅผ ์์ฑํ๋ ๋ชจ๋ ํ๋ฌ๊ทธ์ธ ํ๋ก์ ํธ์ OpenPEG์ ๋ํ ์๋ฆผ์ ์ ๊ณตํ๊ณ v1 ์ด์ ์ ์ ์ฒด ECMAScript 2015 ํ์๋ฅผ PEG.js ๋ฌธ๋ฒ ํ์์ ๊ตฌํํ๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.