pegjsλ κ°λ¨νκ³ κ°λ ₯ν©λλ€. λλ κ·Έκ²μ μ’μνλ€! λ¬Έμμμ λ€λ£¨μ§ μμ λͺ κ°μ§ μ§λ¬Έμ΄ μμ΅λλ€.
λλ μ΄κ²μ νμ±νκ³ μμ§λ§ μλνμ§λ§ κ·μΉμ΄ μ΄μν΄ λ³΄μ λλ€.
f = x => x * x
μ°μ°μλΌκ³ νλλ‘ μμνλ©΄ κ°μ μ λ¬ν λ°©λ²μ΄ μμ΅λλ€. ValuesOperators λ° λλ = λ° =>λ₯Ό μμ±νλ©΄ μ’ λ κΉλν΄ μ§μ§λ§ μ΅μμ μμ€μμλ μ¬μ ν μ΄λ κ²μ΄μλμ§ νμΈν΄μΌ ν©λλ€. JavaScript μμ μμ { type: "Literal", value: ... } μ¬μ©μ λ΄ λλ€. κ·Έκ²μ΄ μ 보λ₯Ό λ°±μ νλ κ°μ₯ μ’μ λ°©λ²μ λκΉ?
= values:Values body:(_ "=>" _ Expression)? assign:(_ "=" _ Expression)? {
if (body && body.length > 0) {
return new Function(values, body[3]);
} else if (assign) {
return new Assignment(values, assign[3]);
} else {
return values;
}
}
κ°μ¬ ν΄μ!
λ§μ΄ν¬
λ¬Έλ²μμλ κ·μΉμ μ΄ν΄νλ κ²μ΄ νμμ μ
λλ€. κ·Έλ¦¬κ³ λΉμ μ μλΈ λ§ μ 곡νκ³ μμ΅λλ€ .. μ΄κ²μ λμκ² λͺ
ννμ§ μμ΅λλ€. μ΄λ»κ² κΈ°κ³μ λͺ
ν ν μ μμ΅λκΉ?
LALR λ¬Έλ²μ μ°κΈ°κ° λ§€μ° μ΄λ ΅μ§λ§ LRλ³΄λ€ μ½κ³ LLλ³΄λ€ μ½μ΅λλ€.
PEG λ¬Έλ²μ μ°κΈ° μ½κ³ ν¨μ¨μ μΌλ‘ μ°κΈ°κ° κ°μ₯ μ΄λ ΅μ΅λλ€.
μ¬λ°λ₯Έ μ₯λκ°μ μ¬μ©νκ³ μμ΅λκΉ? νλ₯ν PEG λ¬Έλ²μ κ°μ§κ³ μλ€λ©΄ νΈλμ€νμΌλ¬λ₯Ό λ§λ€κ±°λ κ·μΉμ ν΄μνλ κ²μ²λΌ μ½κ² ν΄μν μ μμ΄μΌ ν©λλ€.
κ°μ λ¨Έμ μ boxing/unboxingμ μμλκΉ?
μ΄λ»κ² ν λΉμ μΌμͺ½μ values
λ₯Ό κ°μ§ μ μμ΅λκΉ? body:(_ "=>" _ Expression)?
κ° ?λ‘ λλ¬κΈ° λλ¬Έμ
λλ€
λΉμ μ λ¬Έλ²μμ values
λ 무μμ μλ―Έν©λκΉ? Lκ° μ΄ λ¬΄μμΈμ§ μμλκΉ?
λ¬Έλ²μ μλ―Έμ κ°κΉκ² μ μ§ν΄μΌ ν©λλ€. μ΄λ€ κ²½μ°μλ PEGκ° μ΄λ ΅μ΅λλ€. { type: "Literal", value: ... }
λ μ νν ASTμμ νμν κ²μ
λλ€. http://astexplorer.net/μμ μ΄λ»κ² μκ²Όλμ§ μ΄ν΄λ³΄μΈμ.
λ°©κΈ μ€νμ μν΄ κ·Έκ²μ μ¬μ©νκΈ° μμνμ΅λλ€. κ·Έλμ λ€, μΌλΆ μ΄λ¦μ΄ μ¬λ°λ₯΄μ§ μμ΅λλ€. :) κ°λ¨ν LL(1) νμλ₯Ό λͺ κ° μμ±νμ§λ§ μ€λλ§μ λλ€. κ²°μ μ λ΄λ¦¬λ κ°μ₯ μ’μ λ°©λ²μ΄ 무μμΈμ§ κΆκΈν©λλ€. μ΄ κ΅¬λ¬Έμ λ¨μννκ² μ΅λλ€.
μμ΄ = γ΄
λλ
x => x * x
μ΄λ°μμΌλ‘ νλκ² λ λ§λμ?
ν λΉ λλ κΈ°λ₯
= ident:μλ³μ μ°μ°μ:IdentOperator {
if (operator.type === "ν¨μ") {
...
}
μλ³μ μ°μ°μ
= "=" !">" { return { μ ν: "ν λΉ"; } }
/ "=>" { ... }
μ°Έκ³ λ‘, "κ°"μ νλͺ© λͺ©λ‘μ μλ―Ένλ λ° μ¬μ©ν μ©μ΄μ λλ€. ννλ‘ μ¬μ©νλ©΄ κ°μ΄μ§λ§ ν¨μ μΈμλ₯Ό μ μνλ λ° μ¬μ©νλ©΄ λ³μμ λλ€. μλ₯Ό λ€μ΄ (2 + 3).
μκ° λ΄ μ€μ κ³ λ§μ!
@mikeaustin κ·Έκ²μ λΉμ μ κ²μ λλ€ :-)
λ¬Έλ²μ μ°λ κ²μ λͺ¨λ μΆμ μ κ΄ν μ±λͺ μ μ λλ€. κ·Έκ²μ λ¬Έμ₯κ³Ό κ°μ΅λλ€. μλ€μνΌ, λΉμ μ LL λ¬Έλ²μ κ°μ§κ³ μμ΅λλ€ :-)
λ¬Έλ²μ μλ―Έλ‘ μ μνλ κ²μ λΉμ μ μ± μμ λλ€ (λλλ‘ μμ΄μ λ¬Έμ κ° μμ΄ μ£μ‘ν©λλ€ :-D)
AssignmentOrFunctionμ μ΄λ»κ² μ²λ¦¬νμκ² μ΅λκΉ? μ΄κ²μ κΈ°λ³Έμ μΌλ‘ λ§μ μΈμ΄μ λ¬Έκ³Ό λμΌνμ§λ§ R-κ° λ λ μ μμ΅λλ€.
λ°λνΈμμ
= "=" !">" { return { type: "Assignment"; } }
/ "=>" { ... }
λ€μκ³Ό κ°μ΄ λ μ μΈ μ μμ΅λλ€.
= "=>" { ... }
/ "=" { return { type: "Assignment"; } }
λ΄κ° ν릴 μλ μμ΅λλ€. κ·Έλ¬λ μ΄κ²μ κ·Έλ€μ§ μ€μνμ§ μμ λΆλΆμμ λ¬Έμ₯μ κΉ¨λ κ² κ°μ΅λλ€. λ§₯λ½μ΄ μμΌλ©΄ μ΄κ²μ νκ°νλ κ²μ΄ μ€μνμ§ μμ΅λλ€..
PEGλ λλ¬ν μ μλ κ·μΉμ μ½κ² μμ±ν μ μκ±°λ λ¬Έμ₯μ λμ©νμ¬ μλͺ» νκ°νλ κ·μΉμ μμ±ν μ μκΈ° λλ¬Έμ μ°κΈ°κ° μ λ§ μ΄λ ΅μ΅λλ€. λ°λΌμ μ΄λ³΄μλΌλ©΄ μΌμͺ½μ λ¬Έμ₯μ΄ μμ΄μΌ νκ³ μ€λ₯Έμͺ½μ νμ ASTκ° νμ μμ΄μΌ ν©λλ€. λ¬Έλ² κ·μΉλ³΄λ€ μλνλ ν μ€νΈκ° λͺ λ°° λ λ§μ΅λλ€. μ λ₯Ό λ―ΏμΌμΈμ. κ·μΉ νλλ₯Ό λ³κ²½νλ©΄ μ 체 νμκ° κ³ μ₯λ κ²μ λλ€.
κ·Έλ¦¬κ³ λ¬Όλ‘ λΉμ μ κ°μ§κ³ λκ³ , 무μΈκ°λ₯Ό μ°κ³ , κ³μν΄μ λ°λ³΅ν΄μΌ ν©λλ€. PEGλ‘ ν¨κ³Όμ μΈ ννμ κ³μ°κΈ°λ₯Ό μμ±νλ κ²μ μ¬μν μΌμ΄ μλλλ€. μ¬λ¬ μμ€μ μ°μ μμμ μ μνμμμ€. PEGλ μΌλ°μ μΈ κ΅¬λ¬Έ λΆμμ λ μ’μ΅λλ€.
λΉμ μ λΉμ μ μ§λ¬Έμ λ λ§μ λ§₯λ½μ μ 곡νμ§ μμΌλ―λ‘ λΉμ μ΄ μ λ§λ‘ λ§λ€κ³ μΆμ κ²μ μΆμΈ‘νκΈ°κ° λ§€μ° μ΄λ ΅μ§λ§ λ¬Έλ²μ λ λ§μ΄ λ€λ£¨μ΄μΌ νλ€κ³ μΆμΈ‘ν μ μμ΅λλ€. AntLR , νμ΅μ μν νλ₯ν λꡬ, GoldParser(LALR)(λ΄ μ²« λ²μ§Έ μ₯λκ° :-) ), μ ν μ€νΈλκ³ κ°μ₯ ν¨μ¨μ μ΄μ§λ§ ν ν¬λμ΄μ /νμ(μ΄μ lex λ° yacc, μ΅μ flex λ° bison)λ‘ λΆν λ μΌλΆ ꡬμ νμ, λ§μ ν¬νΈ ..
PEGκ° κ°μ₯ λ¨μν΄ λ³΄μ λλ€. μ λ§μ΄μΌ. νμ§λ§ νμ κ°μ₯ μνν κ²μ λλ€...
κ°μ¬ν©λλ€! μ, pegjsμ© Google κ·Έλ£Ήμ μ°Ύμμ§λ§ κ°λ° μΉμ μ μκΈ° λλ¬Έμ λμΉμ±μ§ λͺ»νμ΅λλ€. λ€λ₯Έ μ§λ¬Έμ΄ μμΌλ©΄ λμ κ±°κΈ°μ κ°κ² μ΅λλ€.
μ, ν λΉ "x = y"λ _statement_μ΄μ§λ§ "x => x * x"λ _expression_μ μΌλΆμΌ μ μμΌλ©° "x == y" λ±μ λλ€. "="λ νΉλ³ν κ²½μ°μ΄λ―λ‘ μ κ· μ°μ°μκ° μλλΌλ μ μμ "=>"μ λλ€. λ λ§μ΄ μ°μ΅νκ³ μμ λ₯Ό λ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€. κ³μ°κΈ°λ³΄λ€ ν¬μ§λ§ λ€λ₯Έ μλ³΄λ€ μμ μκ° μμΌλ©΄ μ’κ² μ΅λλ€. μ΄μ©λ©΄ λ΄κ° λ°μ νλ€λ©΄ κ·Έκ²μ μκ° λ μ μμ΅λλ€ :)
λ΄ νλ‘μ νΈμ κ²½μ° JSλ‘ λ³νν κ°λ¨ν μΈμ΄λ₯Ό μμ±νκ³ μΆμ΅λλ€. κΈ°λ³Έμ μΈλΆμ μ΄ν λ²μ λ©μλ(Dylan λλ CLOSμ κ°μ΄ μμμ΄ ν¨μΉλ μμ§λ§ λ€μ€ λ©μλ μμ), ν€μλ μΈμ, ADT, μ΄μ©λ©΄ μ νμ μ μ μ λ ₯μΌ μλ μμ΅λλ€. "λ¨μ"μ λͺ¨λ κ²μ΄ ν¨κ» μλνλ€λ κ²μ μλ―Ένλ©° 무μΈκ°λ₯Ό μννλ λ°©λ²μ λ¨ ν κ°μ§λΏμ λλ€. κ°λ¨ν κ²μ λ§λλ κ²μ _μ΄λ €μ΄_ μ μμ΅λλ€.
λν λ€μ΄ν°λΈ ꡬ문μ μ΄μ μ μ»μ μ μλ adt λ° multimethods μ κ°μ λΌμ΄λΈλ¬λ¦¬κ° μμ΅λλ€. κ·Έκ²λ€μ μ€μ λ‘ sweet μΌλ‘ λ¬μ±ν μ μμ§λ§ sweet λ JSλ₯Ό νμ₯ν μ μμ λΏ λ κ°λ¨νκ² λ§λ€ μλ μμ΅λλ€. TypeScript μλ "--strictNullChecks"μ κ°μ μ΅μ μ΄ μκ³ μΈλΌμΈ 곡μ©μ²΄ μ νμ μ§μνμ§λ§ JSλ₯Ό νμ₯νμ¬ λͺ¨λ λμ κ²μ κ·Έλλ‘ λ‘λλ€(μμμ κ°μ λ³ν, λ¬Έμμ΄ μ°κ²°μ λν "+", λ²μ νΈμ΄μ€ν λ±).
λ€μ ν λ², λͺ¨λ λμμ κ°μ¬λ립λλ€!
λ§μ΄ν¬
λλ μμΆμ νμ§ μκ³ μμ¬μ λΆλ¦¬μ§ μλλ€λ κ²μ "νμ¬ μ΄λμ μλ " μμ ν΄μΌ νλ€λ κ²μ μλ―Ένλ€κ³ κ°μ νμ§λ§, κ·Έλ μ§ μμ΅λλ€. μΌ!
Greedyλ μΌμΉνλ νλͺ©μ μ°ΎμΌλ©΄ κ°μ Έκ° κ²μ΄λΌλ μλ―Έμ λλ€. λ§μ΅λκΉ? κ·Έλ¬λ μ 체 κ·μΉμ΄ μΌμΉνμ§ μμΌλ©΄ λ€μ κ²½κΈ°μ μ²μλΆν° λ€μ μμλ©λλ€. μ΄κ²μ λ΄κ° μ²μ μλνλ λ°©λ²λ³΄λ€ ν¨μ¬ μ½κ² λ§λλλ€.
x, y = 2 + 3.foo + "foo", 5 * 2
ν λΉμ΄ μ κ·μ λ±κ³Ό λ³λλ‘ μΌμΉν μ μλ κ²½μ° μ΄λ μλΉν μ½μ΅λλ€.
= Assignment
/ Expression
Assignment
= vars:Variables _ "=" _ expr:Expression
Variables
= head:Identifier tail:(_ "," _ Identifier)*
...
@mikeaustin PEGλ ννμμμ μΌμΉνλ 첫 λ²μ§Έ ν¨ν΄μ΄ μλμΌλ‘ μΌμΉνλ€λ κ²μ μλ―Ένλ μ ν μ @langpavel μ μλ =>
λ³΄λ€ =
=>
λν μ νΈλλ₯Ό νννλ μ’μ λ°©λ²μ
λλ€. "ννμ΄ λ μ μλ μ΄ λͺ¨λ ν
μ€νΈλ₯Ό κ°μ Έμ λμ€μ μμλ΄κΈ°" λμ "μ΄κ² μ€ νλ"λΌλ μ©μ΄λ‘ ννμ΄ λ¬΄μμΈμ§ λ μκ°νκ³ μΆμ μλ μμ΅λλ€.
= FunctionExpression
/ Assignment
/ Value
μμ°νκΈ° μν΄ μ λ μ¬λ¬λΆμ΄ κ°μ§κ³ λ μ μλ ν
μ€νΈ λ¬Έλ² μ λ§λ€μμ΅λλ€. μ½κ° μλλ½μ§λ§ μ¬λΆμ 곡백 λ° μ°μ°μλ₯Ό νμ©νλ κ²κ³Ό κ°μ λͺ κ°μ§ μ¬νμ 무μνκ³ κ½€ λ¨μνκ² μ μ§νλ €κ³ λ
Έλ ₯νμ΅λλ€. λ§λ²μ΄ μΌμ΄λλ Expression
λΈλ‘μ μ£Όλͺ©νμμμ€. λν SubExpression
λ° ExpressionList
μ κ°μ κ²μ "μ΄ μ€ λ§μ" μν©μ μ²λ¦¬νλ λ°©λ²μΌλ‘ μ¬μ©νμ΅λλ€. μ΄ ν¨ν΄μ λͺ©λ‘ κ΅¬λΆ κΈ°νΈμ νλͺ©μ λΆλ¦¬νλ λ° μ ν©ν©λλ€.
κ°κ°μ κ²½μ°μ μ λ κ° μ’ λ₯μ μΌμΉ νλͺ©μ λν΄ νλμ νλͺ©μ μ¬μ©νμ¬ λ¬Έλ²μ λ¨μνκ² μ μ§νλ €κ³ λ Έλ ₯νκ³ μμ΅λλ€. κ°λ₯ν λͺ¨λ μ‘°ν©μ΄ ν¬ν¨λ νλμ ν° μΌμΉ μνμ€λ₯Ό κ°λλ‘ λ€μ μμ±ν μ μκΈ° λλ¬Έμ μ½κ°μ μ€λ³΅μ±μ΄ μμ΅λλ€. λμμ΄ λκΈ°λ₯Ό λ°λλλ€.
μν λ¬Έλ² νλ² λ³Όκ²μ κ°μ¬ν©λλ€! JavaScript λ¬Έλ²μ΄ κ½€ ν¬κΈ° λλ¬Έμ μΈμ΄μ μ΅μνμ νμ μ§ν©μ 보λ λ° λμμ΄ λ©λλ€.
: @dmsnell λ΄κ° κ·μΉμ μ κ±°νκ³ μλ° μ€ν¬λ¦½νΈ λ¬Έλ²μ λͺ κ°μ§ μλ‘μ΄ κ²λ€μ μΆκ°νμ¬ μ΅κ·Όμ λ§μ κ²μ λ°°μ , λΉμ μ μ¬κΈ°μ μ΅μ λ³Ό μ μμ΅λλ€ impulse.pegjsμ . μλ΅ κ΅¬λ¬Έ [,,], μΌλΆ μ°μ°μ, μνμ€ ννμ λ±μ μ κ±°νκ³ νν ꡬ문(1, 2) λ° λ²μ ꡬ문 1..5λ₯Ό μΆκ°νμ΅λλ€. λΆλ μμμ μ«μλ 리ν°λ΄ λ²μλ₯Ό λ μ½κ² ꡬ문 λΆμν μ μλλ‘ μμͺ½μ μμκ° νμν©λλ€.
μ λ μ΅κ·Όμ λ§μ λ°νμ μμ μ νκ³ μμ§λ§ μ€μ λ‘ JavaScriptλ₯Ό λ΄λ³΄λ΄λ €λ©΄ νμλ‘ λμκ°κ³ μΆμ΅λλ€. μ λ μμ μ¬μ΄μ μμΌλ―λ‘ μκ°μ΄ μ‘°κΈ μμ΅λλ€. :) νμ₯ λ©μλ, λͺ λͺ λ 맀κ°λ³μ, νΉμ± λ° λ―Ήμ€μΈ, μ°μ°μ μ€λ²λ‘λ© λ° λ¦¬ν°λ΄ νν λ° λ²μ ꡬ문μ μ¬μ©νμ¬ JavaScriptμ κΉλν λ°©μΈμ λν λͺ κ°μ§ μμ΄λμ΄ .
λ€μ νλ² κ°μ¬ν©λλ€!
λ§μ΄ν¬
κ°μ₯ μ μ©ν λκΈ
λλ μμΆμ νμ§ μκ³ μμ¬μ λΆλ¦¬μ§ μλλ€λ κ²μ "νμ¬ μ΄λμ μλ " μμ ν΄μΌ νλ€λ κ²μ μλ―Ένλ€κ³ κ°μ νμ§λ§, κ·Έλ μ§ μμ΅λλ€. μΌ!
Greedyλ μΌμΉνλ νλͺ©μ μ°ΎμΌλ©΄ κ°μ Έκ° κ²μ΄λΌλ μλ―Έμ λλ€. λ§μ΅λκΉ? κ·Έλ¬λ μ 체 κ·μΉμ΄ μΌμΉνμ§ μμΌλ©΄ λ€μ κ²½κΈ°μ μ²μλΆν° λ€μ μμλ©λλ€. μ΄κ²μ λ΄κ° μ²μ μλνλ λ°©λ²λ³΄λ€ ν¨μ¬ μ½κ² λ§λλλ€.
x, y = 2 + 3.foo + "foo", 5 * 2
ν λΉμ΄ μ κ·μ λ±κ³Ό λ³λλ‘ μΌμΉν μ μλ κ²½μ° μ΄λ μλΉν μ½μ΅λλ€.