ํ์ฌ ๋์: 2 * 5 + SUM(1, 2, 3)
[
"2",
"*",
"5",
"+",
"SUM",
"(",
[
"1",
",",
"2",
",",
"3"
],
")"
]
์ํ๋ ํ๋ : 2 * 5 + SUM(1, 2, 3)
[
"2",
" ",
"*",
" ",
"5",
" ",
"+",
" ",
"SUM",
"(",
[
"1",
",",
" ",
"2",
",",
" ",
"3"
],
")"
]
๋ณต์ฌํ ๋ฌธ๋ฒ: https://pastebin.com/zpwqT6Uw
PEG.js ๋์ดํฐ https://pegjs.org/online
๋ด๊ฐ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น?
@futagoza ๊ท์ฐฎ๊ฒ ํด์ ์ ๋ง ์ฃ์กํ์ง๋ง PEG.js๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ์ฒ์์ด๊ณ ์ด ๋ฌธ์ ๋ ์ ์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํํธ ์ข ๋ถํ๋๋ ค๋ ๋ ๊น์?
์น์ ํ๋,
๋ง๋
๋๋ ๋น์ ์ ๋ฌธ๋ฒ(์ด์ ์ ์ง๊ธ ๋ง)์ ์ดํด๋ณด๋ ค๊ณ ์๋ํ์ง๋ง ๊ทธ๊ฒ์ ์ดํดํ๊ธฐ๊ฐ ์ ๋ง ์ด๋ ต๊ธฐ ๋๋ฌธ์(์ด๋ฆ ์ง์ ๊ท์น์ ์ ์ณ๋๊ณ , ์์งํ ํ์์ ๋์ฒ์ ์์ต๋๋ค), ํด๊ฒฐ์ฑ ์ ์ฐพ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
const
๋ฐํ [left_space, cnst, right_space]
)[].concat.apply([], con)
๊ทธ๋๋ ์์งํ ๋งํด์ ์ด๊ฒ์ ๋์๊ฒ ํดํค ์๋ฃจ์ ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ์ฌ์์ด๋ ๋ค๋ฅธ ๊ฒ์ ๋ํ ๋งํฌ๊ฐ ์์ต๋๊น? ์์ ํดํค ์๋ฃจ์ ์์ด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ๋ด๊ฐ ๋ณ๊ฒฝํ ์ ์๋ ๊ท์น๊ณผ ๋ณ๊ฒฝํ ์ ์๋ ๊ท์น์ ์๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด ๊ธฐ๊บผ์ด ์๊ฐ์ ํฌ์ํ๊ณ ๋ฌธ๋ฒ์ ์ ๋ฆฌํ๊ณ ๋ช ๊ฐ์ง ๊ท์น์ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด(๊ทธ๋์ ์ํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ํ์ ํ ์ ์์ต๋๋ค), ๊ธฐ๊บผ์ด ๋ ๋ค๋ฅธ ์๋๋ฅผ ํด๋ณผ ๊ฒ์ ๋๋ค ๐
@marek-baranowski - ์ง๊ธ๊น์ง ์ด๊ฒ์ ๋ณด์ง ๋ชปํด์ ์ฃ์กํฉ๋๋ค. ์ด๊ฒ์ด ์ฌ์ ํ ๋น์ ์๊ฒ ์ ์ฉํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ณต๋ฐฑ์ ์ ์งํ๋ ค๋ฉด ์ผ์น ๊ฐ๋ฅํ ์ฝํ ์ธ ๋ก ์ทจ๊ธํ์ญ์์ค.
๋ ๊ณต๊ฐ์ ๋ํด ์ํ๋ ๊ฒ์ด ์ ํํ ๋ฌด์์ธ์ง ๋ช ํํ์ง ์์ต๋๋ค. ๋ ๊ฐ์ ๊ณต๋ฐฑ ๋ฌธ์์ด์ด๋ ๋ ๊ฐ์ ํ ๊ณต๊ฐ ๋ฌธ์์ด ๋ฐฐ์ด์ด ์์ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋๋ ์ ์๋ฅผ ๊ธฐ๋ํ์ง๋ง ... ๋ชจ๋ ๊ฒ์ ๋ฌธ์ ๋น์ ๋๋ค.
๋ํ ... ํจ์ ํธ์ถ์ ์ ์ธํ๊ณ ์ ๊ทธ๋ ๊ฒ ๊ธธ ์์ ๋ฌธ์๋ฅผ ์ํฉ๋๊น? ํ์๋ ๋น์ ์ ์ํด ๊ทธ๊ฒ๋ค์ ์์ฝํด์ผํฉ๋๋ค.
์ด์จ๋
์์ฒญํ์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Document = Expression*
Whitespace
= tx:[ \r\n]+ { return tx.join(''); }
Number
= str:[0-9]+ { return str.join(''); }
Oper
= '+'
/ '-'
/ '/'
/ '*'
/ ','
Label
= l:[a-zA-Z]+ { return l.join(''); }
Parens
= '(' Whitespace? ex:Expression* Whitespace? ')' { return ex; }
Expression
= Number
/ Oper
/ Whitespace
/ Label
/ Parens
/ [^()]+
๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋น์ ์ด ์ํ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํ์ง ๋ชปํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋์ ์ซ์์ ์ฐ์ฐ์๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ๊ฐ๊ฐ์ ๋ํด ํ์คํ๋ ๋ ธ๋ ๋ชจ์์ ๋ฐํํ ์ ์์ต๋๋ค.
Document = Expression*
Whitespace
= tx:[ \r\n]+ { return {
ast: 'whitespace', value: tx.join('')
}; }
Number
= str:[0-9]+ { return {
ast: 'number', value: parseInt(str,10)
}; }
Oper
= '+' { return { ast: 'oper', value: 'add' }}
/ '-' { return { ast: 'oper', value: 'subtract' }}
/ '/' { return { ast: 'oper', value: 'divide' }}
/ '*' { return { ast: 'oper', value: 'multiply' }}
/ ',' { return { ast: 'oper', value: 'sequence' }}
Label
= l:[a-zA-Z]+ { return {
ast: 'label', value: l.join('')
}; }
Parens
= '(' Whitespace? ex:Expression* Whitespace? ')' {
return { ast: 'parens', value: ex
}; }
Expression
= Number
/ Oper
/ Whitespace
/ Label
/ Parens
/ [^()]+
์ด์ ์ฌ์ ํ ๊ณต๋ฐฑ์ด ์์ง๋ง ์ ์ ํ ๊ตฌ๋ฌธ ๋ถ์๋ ํธ๋ฆฌ๊ฐ ์์ผ๋ฉฐ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ์ ์ถ๋ ฅ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ธฐ ์ํด ๊ตฌ๋ฌธ ๋ถ์๊ธฐ๋ฅผ ์์ฑํ ํ์๊ฐ ์์ผ๋ฉฐ ์ค ๋ฒํธ ๋ฑ๊ณผ ๊ฐ์ ์ ๊ทํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์์ํ๋ ๊ฒ๋ ํ์ด์ฒ๋ผ ์ฝ์ต๋๋ค.
@marek-baranowski - ์ด ๋ฌธ์ ์ถ์ ๊ธฐ์ ํฌ๊ธฐ๋ฅผ ๋ค์ ์ค์ด๊ณ ์ถ์ต๋๋ค.
์์ ๋ด์ฉ์ด ํ์ํ ๊ฒฝ์ฐ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๋ ๊ฒ์ ๊ณ ๋ คํด ์ฃผ์๊ฒ ์ต๋๊น? ๊ฐ์ฌํฉ๋๋ค ๐
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ด์ ๋ฅผ ์๋ ค์ฃผ์ธ์. ๋ค์ ์๋ํ๊ฒ ์ต๋๋ค.
@marek-baranowski ๋ ๋ค๋ฅธ ๋ถ๋๋ฌ์ด ํ :smiley_cat:
๋ํ, ๋ฌธ๋ฒ ๋๋ฒ๊น ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด PEG.js ํ๋ฌ๊ทธ์ธ pegjs-syntactic-actions ๋ฅผ ์์ฑํ์ผ๋ฉฐ, ํนํ @StoneCypher์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ์ฌ๊ธฐ์์ ๊ทํ์ ๋ฌธ์ ์ผ ์ ์๋ ์์ ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์ด๋ค ๊ท์น์ ์ํด ์ด๋ค ๋ฌธ์๊ฐ ์บก์ฒ๋๋์ง ํ์ธํฉ๋๋ค.
์ด ํ๋ฌ๊ทธ์ธ์ ์ถ๋ก ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ ๊ฒ๊ณผ ๋ค๋ฅผ ๋ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ข ์ข /๋๋ก๋ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ ๋ง์ ์์ ํ๋์ ์กฐํฉ์ ๊ฒฐ๊ณผ์ด๊ณ ๋์๊ฒ/์ด์ํ๊ฒ ํ๋ํ๋ ํ๋์ ์ฐพ๋ ๊ฒ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋. ์ด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ๊ท์น์ด ์ด๋ค ์บ๋ฆญํฐ๋ฅผ ์บก์ฒํ๋์ง ํ์ธํ๊ณ ์์ ํ ์์ ์ ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค.
์ค์ค ์ด๊ฑฐ ์ง์ง ์ง์ง ๊น๋ํ๋ค
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@marek-baranowski ๋ ๋ค๋ฅธ ๋ถ๋๋ฌ์ด ํ :smiley_cat:
๋ํ, ๋ฌธ๋ฒ ๋๋ฒ๊น ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด PEG.js ํ๋ฌ๊ทธ์ธ pegjs-syntactic-actions ๋ฅผ ์์ฑํ์ผ๋ฉฐ, ํนํ @StoneCypher์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ์ฌ๊ธฐ์์ ๊ทํ์ ๋ฌธ์ ์ผ ์ ์๋ ์์ ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์ด๋ค ๊ท์น์ ์ํด ์ด๋ค ๋ฌธ์๊ฐ ์บก์ฒ๋๋์ง ํ์ธํฉ๋๋ค.
์ด ํ๋ฌ๊ทธ์ธ์ ์ถ๋ก ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ ๊ฒ๊ณผ ๋ค๋ฅผ ๋ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ข ์ข /๋๋ก๋ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ ๋ง์ ์์ ํ๋์ ์กฐํฉ์ ๊ฒฐ๊ณผ์ด๊ณ ๋์๊ฒ/์ด์ํ๊ฒ ํ๋ํ๋ ํ๋์ ์ฐพ๋ ๊ฒ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋. ์ด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ๊ท์น์ด ์ด๋ค ์บ๋ฆญํฐ๋ฅผ ์บก์ฒํ๋์ง ํ์ธํ๊ณ ์์ ํ ์์ ์ ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค.