νμ±μ μ§ν μν©μ μμ μν€λ κ²μ κ΅μ₯ν κ²μ λλ€.
μμλλ λμ:
κ°μ²΄λ₯Ό ꡬ문 λΆμλ νμμΌλ‘ λλ립λλ€.
μ€μ νλ:
λλ νμμ ꡬ문 λΆμν μλ§ μκ³ κ°μ²΄λ₯Ό ꡬ문 λΆμλ νμμΌλ‘ λλ릴 μλ μμ΅λλ€.
μλ νμΈμ. κ·νμ μμ²μ λͺ©μ κ³Ό λ§₯λ½(μ΄μ )μ μ΄ν΄νμ§ λͺ»ν©λλ€. ꡬ체μ μΈ μνμ΄ λμμ΄ λ μ μμ΅λλ€.
ꡬ문 λΆμμ λ¬Έμμ΄μ μΈμ΄μ μΌλΆλ‘ μΈμνκ³ μ νμ μΌλ‘ 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κ° μμΌλ©΄ μλ μ
λ ₯μ λ€μ λ§λλ κ²μ λ§€μ° κ°λ¨ν©λλ€...
μ¬κΈ°μμ μ¬λ¬ ν보μλ₯Ό μ°Ύμ μ μμ΅λλ€.
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 λ¬Έλ²μ μ½λ λκ΅¬κ° μμ΅λκΉ?
κ°μ₯ μ μ©ν λκΈ
μλ νμΈμ. κ·νμ μμ²μ λͺ©μ κ³Ό λ§₯λ½(μ΄μ )μ μ΄ν΄νμ§ λͺ»ν©λλ€. ꡬ체μ μΈ μνμ΄ λμμ΄ λ μ μμ΅λλ€.
ꡬ문 λΆμμ λ¬Έμμ΄μ μΈμ΄μ μΌλΆλ‘ μΈμνκ³ μ νμ μΌλ‘ ASTλ₯Ό ꡬμ±νκ±°λ
parse(text) --> result
νμμ ννμμ νκ°(ν΄μ)ν©λλ€.μ΄ _parse()_ ν¨μλ μΌλ°μ μΌλ‘ μ λ¨μ¬ ν¨μμμ 보μ¦νμ§ μμ΅λλ€. λ°λΌμ μλ₯Ό λ€μ΄ ꡬ문 λΆμ μ€μ μΈλΆ μ 보λ₯Ό μμ ν μ μμΌλ―λ‘ κ΅¬λ¬Έ λΆμμ λλ릴 μ μλ€λ 보μ¦μ μμ΅λλ€.
ASTκ° μ£Όμ΄μ§λ©΄ μΈμ΄μ ν΄λΉνλ ν μ€νΈλ‘ ννμμ μμ±ν μ μμ΅λλ€. μ΄κ²μ μ½λ μμ±μ μΌλΆλ‘ μνλλ©° ν νλ¦Ώ μμ§μ μ¬μ©νμ¬ ASTλ₯Ό μμ€ μ½λλ‘ λ³νν μ μμ΅λλ€. κ·Έλ¬λ μ΄ μμ μ ꡬ문 λΆμ λΌμ΄λΈλ¬λ¦¬μ λ²μλ₯Ό λ²μ΄λ©λλ€.