Pegjs: μž‘μ—… 없이 κ·œμΉ™μ—μ„œ νŠΉμ • ν‘œν˜„μ‹μ˜ 일치 κ²°κ³Ό λ°˜ν™˜ ν—ˆμš©

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

κ·œμΉ™μ˜ 비터미널 쀑 ν•˜λ‚˜ λ˜λŠ” κ΄„ν˜Έ μ•ˆμ˜ ν•˜μœ„ κ·œμΉ™ λ‚΄λΆ€μ—μ„œ 값을 λ°˜ν™˜ν•΄μ•Ό ν•˜λŠ” 것은 맀우 μΌλ°˜μ μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄:

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λ₯Ό μ‚¬λž‘ν•œλ‹€! :웃닀:

feature

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

κ·Έ 아이디어λ₯Ό μ‚¬λž‘ν•˜μ‹­μ‹œμ˜€! ^ 도 맀우 μ§κ΄€μ μž…λ‹ˆλ‹€.

이것은 μ€‘μ²©λ˜μ§€ μ•Šμ€ κ·œμΉ™μ—μ„œλ„ μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

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의 μ˜κ²¬μ— λ©”λͺ¨λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

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