Pegjs: [μœ„μ—…. Req.] νŒŒμ‹± κ³Όμ • μ—­μˆœ

에 λ§Œλ“  2018λ…„ 05μ›” 17일  Β·  13μ½”λ©˜νŠΈ  Β·  좜처: pegjs/pegjs

문제 μœ ν˜•

  • 버그 λ³΄κ³ μ„œ: μ•„λ‹ˆμš”
  • κΈ°λŠ₯ μš”μ²­: 예
  • 질문: 예
  • 문제 μ•„λ‹˜: μ•„λ‹ˆμš”

μ „μ œ 쑰건

  • 문제λ₯Ό μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?: 예
  • μ €μž₯μ†Œ 이슈λ₯Ό κ²€μƒ‰ν•˜μ…¨μŠ΅λ‹ˆκΉŒ?: 예
  • ν¬λŸΌμ„ ν™•μΈν•˜μ…¨λ‚˜μš”?: μ–΄λ–€ ν¬λŸΌμΈκ°€μš”?
  • μ›Ή 검색(google, yahoo λ“±)을 μˆ˜ν–‰ν•˜μ…¨μŠ΅λ‹ˆκΉŒ?: 예!

μ„€λͺ…

νŒŒμ‹±μ˜ 진행 상황을 μ—­μ „μ‹œν‚€λŠ” 것은 ꡉμž₯ν•  κ²ƒμž…λ‹ˆλ‹€.

μ˜ˆμƒλ˜λŠ” λ™μž‘:

객체λ₯Ό ꡬ문 λΆ„μ„λœ ν˜•μ‹μœΌλ‘œ λ˜λŒλ¦½λ‹ˆλ‹€.

μ‹€μ œ 행동:

λ‚˜λŠ” ν˜•μ‹μ„ ꡬ문 뢄석할 수만 있고 개체λ₯Ό ꡬ문 λΆ„μ„λœ ν˜•μ‹μœΌλ‘œ 되돌릴 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

discussion feature task

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš”. κ·€ν•˜μ˜ μš”μ²­μ˜ λͺ©μ κ³Ό λ§₯락(이유)을 μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. ꡬ체적인 μƒ˜ν”Œμ΄ 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

ꡬ문 뢄석은 λ¬Έμžμ—΄μ„ μ–Έμ–΄μ˜ μΌλΆ€λ‘œ μΈμ‹ν•˜κ³  μ„ νƒμ μœΌλ‘œ ASTλ₯Ό κ΅¬μ„±ν•˜κ±°λ‚˜ parse(text) --> result ν˜•μ‹μ˜ ν‘œν˜„μ‹μ„ 평가(해석)ν•©λ‹ˆλ‹€.
이 _parse()_ ν•¨μˆ˜λŠ” 일반적으둜 전단사 ν•¨μˆ˜μž„μ„ λ³΄μ¦ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 예λ₯Ό λ“€μ–΄ ꡬ문 뢄석 쀑에 μ„ΈλΆ€ 정보λ₯Ό μ‚­μ œν•  수 μžˆμœΌλ―€λ‘œ ꡬ문 뢄석을 되돌릴 수 μžˆλ‹€λŠ” 보증은 μ—†μŠ΅λ‹ˆλ‹€.

ASTκ°€ 주어지면 언어에 ν•΄λ‹Ήν•˜λŠ” ν…μŠ€νŠΈλ‘œ ν‘œν˜„μ‹μ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ½”λ“œ μƒμ„±μ˜ μΌλΆ€λ‘œ μˆ˜ν–‰λ˜λ©° ν…œν”Œλ¦Ώ 엔진을 μ‚¬μš©ν•˜μ—¬ ASTλ₯Ό μ†ŒμŠ€ μ½”λ“œλ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 μž‘μ—…μ€ ꡬ문 뢄석 라이브러리의 λ²”μœ„λ₯Ό λ²—μ–΄λ‚©λ‹ˆλ‹€.

λͺ¨λ“  13 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš”. κ·€ν•˜μ˜ μš”μ²­μ˜ λͺ©μ κ³Ό λ§₯락(이유)을 μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. ꡬ체적인 μƒ˜ν”Œμ΄ 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

ꡬ문 뢄석은 λ¬Έμžμ—΄μ„ μ–Έμ–΄μ˜ μΌλΆ€λ‘œ μΈμ‹ν•˜κ³  μ„ νƒμ μœΌλ‘œ ASTλ₯Ό κ΅¬μ„±ν•˜κ±°λ‚˜ parse(text) --> result ν˜•μ‹μ˜ ν‘œν˜„μ‹μ„ 평가(해석)ν•©λ‹ˆλ‹€.
이 _parse()_ ν•¨μˆ˜λŠ” 일반적으둜 전단사 ν•¨μˆ˜μž„μ„ λ³΄μ¦ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 예λ₯Ό λ“€μ–΄ ꡬ문 뢄석 쀑에 μ„ΈλΆ€ 정보λ₯Ό μ‚­μ œν•  수 μžˆμœΌλ―€λ‘œ ꡬ문 뢄석을 되돌릴 수 μžˆλ‹€λŠ” 보증은 μ—†μŠ΅λ‹ˆλ‹€.

ASTκ°€ 주어지면 언어에 ν•΄λ‹Ήν•˜λŠ” ν…μŠ€νŠΈλ‘œ ν‘œν˜„μ‹μ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ½”λ“œ μƒμ„±μ˜ μΌλΆ€λ‘œ μˆ˜ν–‰λ˜λ©° ν…œν”Œλ¦Ώ 엔진을 μ‚¬μš©ν•˜μ—¬ ASTλ₯Ό μ†ŒμŠ€ μ½”λ“œλ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 μž‘μ—…μ€ ꡬ문 뢄석 라이브러리의 λ²”μœ„λ₯Ό λ²—μ–΄λ‚©λ‹ˆλ‹€.

κ°œμΈμ μœΌλ‘œλŠ” @pjmolinaκ°€ μš”μ•½ν•œ κ²ƒμ²˜λŸΌ μ†Œν”„νŠΈμ›¨μ–΄κ°€ ꡬ문 뢄석할 수 μžˆλŠ” 것을 생성할 수 있기λ₯Ό μ›ν•˜λŠ” λŠλ‚Œμ„ μ΄ν•΄ν•˜μ§€λ§Œ 이것은 이 라이브러리(νŒŒμ„œ 생성기)의 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ―€λ‘œ 이 μž‘μ—…μ„ μ’…λ£Œν•©λ‹ˆλ‹€.

λ‚˜λŠ” 당신이 ꡬ문 λΆ„μ„ν•˜λŠ” 언어에 λŒ€ν•œ κΈ°μ‘΄ μ½”λ“œ 생성기λ₯Ό μ‚¬μš©ν•  λ•Œ μžμ‹ λ§Œμ˜ μ½”λ“œ 생성기λ₯Ό λ§Œλ“€ 것을 μ œμ•ˆν•©λ‹ˆλ‹€(ASTκ°€ μ˜¬λ°”λ₯Έμ§€ 확인해야 ν•©λ‹ˆλ‹€).

이 티켓은 λ§Žμ€ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. PEG.js ꡬ문의 문법이 주어진 λ‹€λ₯Έ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ ASTλ₯Ό μ†ŒμŠ€ μ½”λ“œλ‘œ λ³€ν™˜ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜μ‹­λ‹ˆκΉŒ? λ„€, ν˜„μž¬λ‘œμ„œλŠ” 방법이 μ—†μŠ΅λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ ASTλŠ” ν–‰λ™μœΌλ‘œ μƒμ„±λ˜λ©° 되돌릴 수 μ—†μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ ν˜Έμ—μ„œ μ΄μ•ΌκΈ°ν•œ AST 생성을 μœ„ν•œ ꡬ문이 μžˆμ„ λ•Œ κ°‘μžκΈ° 이해가 될 뿐만 μ•„λ‹ˆλΌ κ΅¬ν˜„λ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ StringTemplate 은 μ΄λŸ¬ν•œ μž‘μ—…μ— μ‚¬μš©ν•  수 μžˆλŠ” λ§Žμ€ 도ꡬ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€: AST의 code-gen.

StringTemplate이 PEG.js ꡬ문의 문법을 읽지 μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ¬Έλ§₯:

μ›λž˜ ν…μŠ€νŠΈλ‘œ 되돌리렀면 AST( A bstract S yntax T ree)λ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ JavaScript 문법이 주어지면 이 두 λ¬Έμž₯은
ꡬ문이 μ•½κ°„ λ‹€λ₯΄μ§€λ§Œ 일반적으둜 λ™μΌν•œ ASTλ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

// statement 1
var x = 5

// statement 2 - with semicolon
var x = 5;

μ›λž˜ ν…μŠ€νŠΈλ‘œ 되돌릴 수 있으렀면 ꡬ문 λΆ„μ„κΈ°μ˜ μž‘μ—…μ΄ Injective ν•¨μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€ .

μ œμ•ˆ:

λ‚˜λŠ” 개인적으둜 κ·ΈλŸ¬ν•œ κΈ°λŠ₯이 μ–΄λ–»κ²Œ ꡬ문 뢄석 라이브러리의 일뢀가 될 수 μžˆλŠ”μ§€ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€.
λ‚΄μž₯된 μ‚¬μš©μž μž‘μ—…μ— μ˜μ‘΄ν•˜μ—¬ 좜λ ₯ ꡬ쑰λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

λ―Έλž˜μ— pegjsκ°€ μΌμ’…μ˜ μžλ™ ꡬ문 뢄석 트리 생성 κΈ°λŠ₯을 κ°–κ²Œ λœλ‹€λ©΄
이것은 κ°€λŠ₯ν•©λ‹ˆλ‹€.

λ‚˜λ§Œμ˜ λΉŒλ“œ

λ‚΄λΆ€ pegjs μž„λ² λ””λ“œ μž‘μ—…μ—μ„œ 전체 μœ„μΉ˜ 정보λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.
당신은 CST / 파슀 트리λ₯Ό κ΅¬μΆ•ν•˜λŠ” μ‚¬μš©μž μ •μ˜ λ‚΄μž₯ μž‘μ—…μ„ μ‚½μž… ν•  수 μžˆμŠ΅λ‹ˆλ‹€
ꡬ문 뢄석 ν›„ λ‹¨κ³„μ—μ„œλ§Œ AST둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
CSTκ°€ 있으면 μ›λž˜ μž…λ ₯을 λ‹€μ‹œ λ§Œλ“œλŠ” 것은 맀우 κ°„λ‹¨ν•©λ‹ˆλ‹€...

μžλ™ CST / ꡬ문 뢄석 트리 μƒμ„±μœΌλ‘œ ꡬ문 뢄석 라이브러리 평가

μ—¬κΈ°μ—μ„œ μ—¬λŸ¬ ν›„λ³΄μžλ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.
https://tomassetti.me/parsing-in-javascript/

λ‚˜λŠ” 이것을 λ‹€μ‹œ μ‚΄νŽ΄λ³΄κΈ°λ‘œ κ²°μ •ν–ˆμ§€λ§Œ, 그것이 APIκ°€ μ•ˆμ •λ˜κ³  기본적인 곡톡 AST ꡬ쑰( 예: @pegjs/ast ?). 이 νŒ¨ν‚€μ§€λŠ” νŒŒμ„œ κ°œλ°œμžκ°€ μžμ‹ μ˜ ASTλ₯Ό νŒŒμƒμ‹œν‚€λŠ” 데 μ‚¬μš©ν•  수 있으며, ν•„μš”ν•œ 경우 λ‹€λ₯Έ 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ 이λ₯Ό μ†ŒμŠ€λ‘œ λ‹€μ‹œ λ²ˆμ—­ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€( @pegjs/reverse 라고 μƒκ°ν•©λ‹ˆλ‹€).

@futagoza 이거 μ–΄λ•Œμš”?

@ Coffee2CodeNL pegjs v1은 아직 λ‚˜μ˜€μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

PEGJSμ—μ„œ 이 SVG λ³€ν™˜ νŒŒμ„œλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 예: https://github.com/nidu/svg-transform-parser
이 과정을 μ—­μ „μ‹œμΌœ ASTλ₯Ό λ‹€μ‹œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•  수 μžˆλ‹€λ©΄ ν™˜μƒμ μΌ κ²ƒμž…λ‹ˆλ‹€.
λ”°λΌμ„œ SVG λ³€ν™˜μ€ ꡬ문 λΆ„μ„λΏλ§Œ μ•„λ‹ˆλΌ μ‰½κ²Œ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μœ μ‚¬ν•œ 도ꡬ 쀑 ν•˜λ‚˜λŠ” Augeas μž…λ‹ˆλ‹€.

λˆ„κ΅°κ°€ ASTμ—μ„œ μ½”λ“œλ₯Ό μƒμ„±ν•˜λŠ” λͺ‡ 가지 도ꡬλ₯Ό μΆ”μ²œν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

@lzane μ–΄λ–€ AST?

@polkovnikov-ph PEG에 μ˜ν•΄ μƒμ„±λœ 일뢀 μ‚¬μš©μž μ •μ˜ AST

μ½”λ“œ 생성 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” PEG 문법을 μ½λŠ” 도ꡬ가 μžˆμŠ΅λ‹ˆκΉŒ?

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰