κ·μΉμ λΉν°λ―Έλ μ€ νλ λλ κ΄νΈ μμ νμ κ·μΉ λ΄λΆμμ κ°μ λ°νν΄μΌ νλ κ²μ λ§€μ° μΌλ°μ μ λλ€. μλ₯Ό λ€μ΄:
varDecl = type:type id:ID init:( EQ e:expr {return e} )?
{ return scopedAST('VARDECL', {type, id, init}) }
μ΄ κ²½μ° μΈμ΄μ μ νμ ꡬ문μ λν init
κ΄νΈ μμ€ μμ e
expr
λ μ΄λΈμ΄ μ§μ λ e
κ° νμνμ΅λλ€. λ°νλ κ°μ μΌλΆλ‘ "μ‘μ λ¨μ΄" EQ
κ° νμνμ§ μμμ΅λλ€.
PEGjs μΈμ΄μ μμ expr
μ κ°μ ν°λ―Έλμ νμνλ λ° μ¬μ©ν κΈ°νΈκ° μλ κ²½μ° λ¬Έλ² κ·μΉμ΄λ νμ κ·μΉμμ λ°νλ κ°λ§ μ΄ κ²½μ°κ° λ κ°λ¨ν©λλ€.
μμ μλ₯Ό λ€μ μμ±νλ €λ©΄ λ€μμ μννμμμ€.
varDecl = type:type id:ID init:( EQ ^expr )?
{ return scopedAST('VARDECL', {type, id, init}) }
μ μ¬μ© μ£Ό ^
νμλ‘ expr
λ΄λΆ κ° init
μ λ°μΈλ© κ²μ μ§μ κ΄νΈ μ΅μ
ꡬ문 νμ κ·μΉμ init
. μ΄κ²μ μ΄ μμ νμλ κ΄νΈλ‘ λ¬ΆμΈ νμ κ·μΉμ΄ μκ±°λ μλ λ§μ μν©μ λ¨μνν©λλ€.
λλλλ‘ κ°λ¨νκ³ μ°μνλ©° κ°λ ₯ν λꡬλ₯Ό λ§λ€μ΄ μ£Όμ μ κ°μ¬ν©λλ€. λλ PEGjsλ₯Ό μ¬λνλ€! :μλ€:
κ·Έ μμ΄λμ΄λ₯Ό μ¬λνμμμ€! ^
λ λ§€μ° μ§κ΄μ μ
λλ€.
μ΄κ²μ μ€μ²©λμ§ μμ κ·μΉμμλ μλν μ μμ΅λλ€.
WhiteSpacedIdentifier = WhiteSpace? identifier:Identifier WhiteSpace {return identifier;}
// becomes
WhiteSpacedIdentifier = WhiteSpace? ^Identifier WhiteSpace?
λ§€μ° μ½κΈ° μ½μ΅λλ€! μλ§λ λ€μκ³Ό κ°μ΄ μ¬λ¬ ^
μ¬μ©ν μλ μμ΅λλ€.
a = ^b c ^d e
[b, d]
λ°νν κΉμ? λ§μ΄ λλ κ² κ°μ΅λλ€.
λ§μ°¬κ°μ§λ‘ λͺ
λͺ
λ μΊ‘μ²μ νΌν©νλ©΄ ^
κ·μΉμ΄ 무μλλ―λ‘ μλ―Έκ° μλ κ² κ°μ΅λλ€.
x = a ^b foo:c { return foo; }
cλ§ λ°νν©λλ€.
μ€, κ·Έ λ€μ€ μμ΄λμ΄λ νλ₯ν©λλ€. λͺ
λͺ
λ μΊ‘μ²μ νΌν©ν΄μΌ ν©λλ€.
μ€λ₯.
2016λ
7μ 5μΌ νμμΌ 01:07 Graham Wakefield [email protected]
μΌλ€:
λ§€μ° μ½κΈ° μ½μ΅λλ€! μλ§λ μ¬λ¬ ^λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ μλν κ²μ λλ€.
μμ΄ = ^BC ^λ°
[b, d]λ₯Ό λ°ννμκ² μ΅λκΉ? λ§μ΄ λλ κ² κ°μ΅λλ€.
λ§μ°¬κ°μ§λ‘, λͺ λͺ λ μΊ‘μ²μ νΌν©νλ©΄ μλ―Έκ° μλ κ² κ°μ΅λλ€. ^
κ·μΉμ 무μλ©λλ€.x = ^b foo:c { λ¦¬ν΄ foo; }
β
μ€λ λλ₯Ό μμ±νκΈ° λλ¬Έμ μ΄ λ©μμ§λ₯Ό λ°λ κ²μ λλ€.μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/pegjs/pegjs/issues/427#issuecomment -230413015 λλ μμκ±°
μ€λ λ
https://github.com/notifications/unsubscribe/ABC26k8v0DIzuWUlkoDZGm2ep10Y5bcMks5qShDAgaJpZM4IkuA9
.
μ€λͺ λ ν¨ν΄μ΄ λ§€μ° μΌλ°μ μ΄λΌλ λ° μ μ μΌλ‘ λμν©λλ€. νλ μμ΄ ννν μ μλ λ°©λ²μ΄ μλ€λ κ²μ μλ―Έκ° μμ΅λλ€.
μ μλ μ루μ
( ^
μ°μ°μ)μ λν΄ μ λͺ¨λ₯΄κ² μ΅λλ€. μλ―Έκ° μ¦μ λͺ
ννμ§ μμ νΉμ λ¬Έμλ₯Ό μ¬μ©νλ κ²μ νμ λ¬Έμ κ° λκ³ νμ΅ κ³‘μ μ μΆκ°λ©λλ€. μΊλ¦ν°κ° λ€λ₯Έ λͺ©μ μΌλ‘ λ μ μ¬μ©λ μλ μμ΅λλ€. λ§μ§λ§μΌλ‘ μ€μν κ²μ ꡬ문 λΆμμ μ§μ μ μΈ μν₯μ λ―ΈμΉμ§ μλ κ²μ ννμμ λ£λ μμ΄λμ΄κ° λ§μμ λ€μ§ μλλ€λ κ²μ
λλ€. $
μ°μ°μμ λν μΈμ€ν΄μ€κ° μ΄λ―Έ νλ μλ€κ³ μ£Όμ₯ν μ μμΌλ©° μ λ λμν©λλ€. κ·Έλ¬λ $
κ° (μμ) μ€μκ° μλμ§ νμ€νμ§ μμ΅λλ€. κ·Έλ λ€λ©΄ λ€μλ λ§λ€μ§ μμμΌλ©΄ ν©λλ€.
μ΄μ λν΄μλ 1.0.0 μ΄νμ λ κΉμ΄ μκ°νκ² μ΅λλ€.
μκ°ν κ±°λ¦¬κ° λ μμ΅λλ€. ^
μ λ μ΄λΈμ΄ μ§μ λ ννμμ΄ μΆ©λνκΈ° λλ¬Έμ( @grrrwaaa λ ^
무μλ₯Ό μ μν©λλ€), κ²°κ³Όλ₯Ό νμνλ λμ _ignored_ ννμμ νμν μ μμ΅λλ€. (ꡬ문 μ μ!) λΉ λ μ΄λΈμ μ 곡νμ¬:
WhiteSpacedIdentifier = WhiteSpace? identifier:Identifier WhiteSpace {return identifier;}
// becomes
WhiteSpacedIdentifier = :WhiteSpace? Identifier :WhiteSpace?
κ±°κΈ°μλ μλ‘μ΄ κ΅¬λ¬Έμ΄ μμ΅λλ€( :
μ΄λ―Έ μμ). μλ―Έλ‘ μ λν μ½κ°μ νμ₯λ§ μμ΅λλ€.
μ΄ κ²½μ° λ³΄λ€ μΌκ΄μ± μλ κ²°κ³Όλ‘ λ°νλμ΄μΌ νλ ννμμ΄ λΉ "λ μ΄λΈ"λ‘ νμλ©λλ€. 그건 κ·Έλ κ³ , κΈ°μ‘΄ μλ―Έλ₯Ό κΉ¨λ¨λ¦¬μ§ μλ κ²μ λλ€. λ μ΄λΈμ μ‘΄μ¬νμ§λ§ μ΄λ¦μ΄ μμ΅λλ€. κ²°κ³Όμ λν μ‘μΈμ€λ₯Ό μν΄ λ μ΄λΈμ΄ λμ λμμΌλ―λ‘ μ΄λ¦ μλ λ μ΄λΈμ΄ μλμΌλ‘ κ²°κ³Όκ° λλ κ²μ λ§€μ° λ Όλ¦¬μ μ λλ€. μλ λΌλ²¨κ³Ό ꡬ체μ μΈ λΌλ²¨μ΄ λμμ μ‘΄μ¬νλ κ²μ κΈμ§λ©λλ€. μλ λ μ΄λΈμ΄ νλλ§ μλ κ²½μ° μ΄λ¬ν λμμ΄ λ μꡬλκΈ° λλ¬Έμ λ¨μΌ κ²°κ³Όκ° λ°νλμ§λ§ μμκ° νλμΈ λ°°μ΄μ λ°νλμ§ μμμΌ ν©λλ€.
@λ―Όκ΅°
λ μ΄λΈμ λ°ννμ§ μλ μ΄μ λ 무μμ
λκΉ?
start = "{" :expr "}" // return expr
start = "{" label:expr "}" // return label
λλ λΉμ μ΄ λ¬΄μΈκ°μ "λΌλ²¨"μ λΆμ΄λ©΄ λΉμ μ΄ κ·Έκ²μΌλ‘ 무μΈκ°λ₯Ό νκΈ°λ₯Ό μνλ€λ κ²μ΄ μ΄μΉμ λ§λ€κ³ μκ°ν©λλ€(μλ₯Ό λ€μ΄ κ·Έκ²μ λ°ν).
λ°λ©΄μ start = ex:expr :expr
μ κ°μ κ·μΉμ΄ μ€λ₯λ₯Ό λ°μμμΌμΌ νλ μ΄μ λ 무μμ
λκΉ?
μλ§λ μλ° μ€ν¬λ¦½νΈμ ν¨μμ μΈμ λ³μμ μ μ¬ν μμ
μ μνν΄μΌν©λκΉ? μλ₯Ό λ€μ΄ start = ex:expr :expr
λ [ex, expr]
λ°νν΄μΌ ν©λλ€. μμ
μ΄ μμ λ λ μ΄λΈμ΄ μ§μ λ & arguments
λ³μ( start = ex:expr :expr { return [ex, arguments[0], ex] }
)κ° μμ΄μΌ ν©λλ€.
@alanmimms μ΄ μμ΄λμ΄κ° λ§μμ
μ΄λ¦ μλ λ μ΄λΈ( :expr
)μ΄ ^expr
λ³΄λ€ λ«λ€κ³ μκ°ν©λλ€.
λ μ΄λΈμ λ°ννμ§ μλ μ΄μ λ 무μμ λκΉ?
@nedzadarek μμ μ΄λ¦μ μ§μ νλ©΄ μ¬μν ννμμ μ¬μ©νμ§ μμ κ°λ₯μ±μ΄ λ λκΈ° λλ¬Έμ λλ€. μ μ΄λ μ΄λ¦μ λΉμ μκ² μ€μν©λλ€. κ·Έλ μ§ μμΌλ©΄ λΉμ μ΄ κ·Έκ²μμ£Όμ§ μμ κ²μ λλ€, μ λ§λ‘? λν, λͺ λͺ λ λΌλ²¨κ³Ό λͺ λͺ λμ§ μμ λΌλ²¨μ νΌν©νλ κ²μ μμμ μΈ νλλ³΄λ€ μ€μμΌ κ°λ₯μ±μ΄ λ λκΈ° λλ¬Έμ κΈμ§λλ€λ©΄ λ μμ ν κ²μ λλ€. νλμ μ΄λ¦μ μ 곡νλ€λ©΄ λ€λ₯Έ μ΄λ¦μ μ 곡νμ§ μλ μ΄μ λ 무μμ λκΉ?
λΆννλ @opatut μμ μ 곡νλ μλ λ μ΄λΈμ λ¬Έλ²μ λͺ¨νΈν¨μ λ§λ€κΈ° λλ¬Έμ ꡬνμ΄ λΆκ°λ₯νλ€λ κ²μ μΈμν νμκ° μμ΅λλ€. κΈ°λ³Έ μ:
start = a :b;// `a` - it is rule reference or label?
a = .;
b = .;
λ°λΌμ μ΄λ₯Ό μν΄μλ λ€λ₯Έ μΊλ¦ν°λ₯Ό μ νν΄μΌ ν©λλ€. νμ¬ ~
, (backslash)
, @
, #
, %
, ^
μ€μμ μ νν μ μμ΅λλ€. , -
, |
, \
λ° ,
.
λ λ€λ₯Έ μ루μ
-- λͺ κ°μ§ μμ¬ μμ
μ μκ°ν©λλ€ -- λ°νμ μν κ°λ¨ν ν¨μ μμ±μ μν λ°λ‘ κ°κΈ°, μλ₯Ό λ€μ΄ {=>[]}
λ _"μνμ€μμ λ μ΄λΈμ΄ μ§μ λ κ²°κ³Όλ₯Ό μμ§νκ³ λ°°μ΄μ λ°ν"μ μλ―Έν μ μμ΅λλ€. , λ° {=>{}}
-- λμΌνμ§λ§ λ μ΄λΈ μ΄λ¦κ³Ό λμΌν ν€λ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό λ°νν©λλ€. κ·Έλ¬λ μ΄ λμμ ꡬνμ λ¬Έλ² νμ₯μ νμλ‘ νμ§ μμΌλ©° νλ¬κ·ΈμΈμ μν΄ μλΉν μ€νλ μ μμ΅λλ€. νλ¬κ·ΈμΈμΌλ‘ κ·Έλ¬ν ꡬνμ νλ κ²μ΄ λ λ°λμ§νλ€κ³ λ§ν μλ μμ΅λλ€.
start1 = a:'a' b c d:. {=>[]};// returns ['a', <d value>]
start2 = a:'a' b c d:. {=>{}};// returns { a: 'a', d: <d value> }
@λ―Όκ΅°
ννμ μ΄λ¦μ μ§μ νλ©΄ μ¬μν ννμμ μ¬μ©νμ§ μμ κ°λ₯μ±μ΄ λ λκΈ° λλ¬Έμ λλ€. μ μ΄λ μ΄λ¦μ λΉμ μκ² μ€μν©λλ€. κ·Έλ μ§ μμΌλ©΄ λΉμ μ΄ κ·Έκ²μμ£Όμ§ μμ κ²μ λλ€, μ λ§λ‘?
λ€, μ΄λ¦μ΄ μ€μν©λλ€ => μ¬μ©νκ³ μΆμ΅λλ€ => λ°ννκ³ μΆμ΅λλ€.
μ¬μνμ§ μμ ννμ λ¬Έμ λ 무μμ
λκΉ?
λΆννλ @opatut μμ μ 곡νλ μλ λ μ΄λΈμ λ¬Έλ²μ λͺ¨νΈν¨μ λ§λ€κΈ° λλ¬Έμ ꡬνμ΄ λΆκ°λ₯νλ€λ κ²μ μΈμν νμκ° μμ΅λλ€. κΈ°λ³Έ μ:
μ.
::expression
λ ν·κ°λ¦¬λ κ² κ°μλ°μ? @dmajda
#235μ μ€λ³΅μΌλ‘ νμλ¨
νΈμ§: μ΄ λ¬Έμ λ₯Ό μ°Έμ‘°νλ #235μ λν OPμ μ견μ λ©λͺ¨λ₯Ό μΆκ°νμ΅λλ€.