Pegjs: νŠΉμ • 생산물을 λ¬΄μ‹œν•˜λŠ” λŠ₯λ ₯

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

λ ‰μ„œ/νŒŒμ„œμ—κ²Œ νŠΉμ • 생성(예: 곡백 및 주석 생성)을 λ¬΄μ‹œν•˜λ„λ‘ μ§€μ‹œν•  수 μžˆμœΌλ―€λ‘œ λ‹€λ₯Έ λͺ¨λ“  생성에 주석/곡백 ν—ˆμš©μ΄ μžˆλŠ” μ“°λ ˆκΈ°λ₯Ό 버릴 ν•„μš”κ°€ μ—†κ²Œ λ©λ‹ˆλ‹€. 렉싱이 ꡬ문 뢄석과 ν•¨κ»˜ λ‚΄μž₯λ˜μ–΄ 있기 λ•Œλ¬Έμ— 이것이 λΆˆκ°€λŠ₯ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€

feature

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

@atesgoral - νƒˆμΆœν–ˆμŠ΅λ‹ˆλ‹€. "μ‹€μ œ νŒŒμ„œ"κ°€ ν•„μš”ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λŒ€μƒ νŒŒμΌμ—μ„œ νŠΉμ • λͺ…λͺ…λœ μš”μ†Œλ§Œ λΆ„λ¦¬ν•˜λ©΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ‚˜λŠ” μ–΄λ–€ λ©μ²­ν•œ μ‚¬λžŒλ„ ν•  수 μžˆλŠ” 일을 ν–ˆμŠ΅λ‹ˆλ‹€. μ •κ·œμ‹μ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. (그리고 두 가지 λ¬Έμ œκ°€μžˆμ—ˆμŠ΅λ‹ˆλ‹€ :-)

ν•˜μ§€λ§Œ μ„±κ³΅ν–ˆκΈ° λ•Œλ¬Έμ— λ‹€μŒ λ„μ „μœΌλ‘œ λ„˜μ–΄κ°ˆ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ— ν–‰μš΄μ„ λΉ•λ‹ˆλ‹€!

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

λ™μ˜. ν˜„μž¬μ΄ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κΉ¨λ—ν•œ 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

@benekastah : ν˜„μž¬λ‘œμ„œλŠ” κΉ¨λ—ν•œ 방법이 μ—†μŠ΅λ‹ˆλ‹€.

이것은 PEG.js의 μž‘λ™ 방식을 λ³€κ²½ν•˜μ§€ μ•Šκ³ λŠ” μˆ˜ν–‰ν•˜κΈ° μ–΄λ €μšΈ κ²ƒμž…λ‹ˆλ‹€. κ°€λŠ₯ν•œ μ†”λ£¨μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μƒμ„±λœ νŒŒμ„œ μ•žμ— λ ‰μ„œλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. 문법 μ–΄λ”˜κ°€μ— κ³ μœ ν•œ κ·œμΉ™μ— λŒ€ν•œ 정보λ₯Ό ν¬ν•¨μ‹œν‚€μ‹­μ‹œμ˜€. 그것은 μ•„λ§ˆλ„ λ¬Έλ²•μ˜ μ–΄νœ˜ μˆ˜μ€€κ³Ό ꡬ문 μˆ˜μ€€μ„ κ΅¬λ³„ν•˜λŠ” 것을 μ˜λ―Έν•  κ²ƒμž…λ‹ˆλ‹€. 이것은 μ œκ°€ ν”Όν•˜κ³  싢은 κ²ƒμž…λ‹ˆλ‹€.

μ§€κΈˆμ€ 이 μž‘μ—…μ„ ν•˜μ§€ μ•Šκ² μ§€λ§Œ κΈ°λŠ₯μ—μ„œ 생각해 λ³Ό λ¬Έμ œμž…λ‹ˆλ‹€.

이 κΈ°λŠ₯이 ν•„μš”ν•©λ‹ˆλ‹€.

"κ±΄λ„ˆλ›°κΈ°"-토큰을 μ†Œκ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ κ·œμΉ™μ΄ ν•΄λ‹Ή 토큰을 λ°˜ν™˜ν•˜λ©΄ λ¬΄μ‹œλ˜κ³  AST(λ°°μ—΄μ˜ ν•­λͺ©μ΄λΌκ³ λ„ 함)에 λ…Έλ“œκ°€ μ—†μŠ΅λ‹ˆλ‹€.

저도 방법을 μ°Ύκ³  μžˆμŠ΅λ‹ˆλ‹€.

큰 문법 파일이 μžˆμŠ΅λ‹ˆλ‹€(SNMP MIB νŒŒμΌμ— λŒ€ν•œ ASN.1 ν˜•μ‹μ„ ꡬ문 뢄석함). μ œκ°€ μ“°μ§€λŠ” μ•Šμ•˜μ§€λ§Œ PEG.jsμ—μ„œ νŒŒμ„œλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ›λž˜ ν˜•μ‹μ—μ„œ μ‚¬μ†Œν•˜κ²Œ λ³€ν˜•ν–ˆμŠ΅λ‹ˆλ‹€. (μ’‹μŠ΅λ‹ˆλ‹€. 사싀 PEG.jsκ°€ 받아듀이도둝 μˆ˜μ •ν•˜λŠ” 데 15뢄도 채 걸리지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.)

λΆˆν–‰νžˆλ„ 문법은 곡백과 주석을 λ§Œλ‚  λ•Œ λ¬΄μ‹œν•  수 μžˆλŠ” κΈ°λŠ₯으둜 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 결과적으둜 νŒŒμ„œκ°€ 곡백의 첫 번째 λ°œμƒμ—μ„œ μ€‘μ§€ν•˜κΈ° λ•Œλ¬Έμ— μ‹€μ œ MIB νŒŒμΌμ„ μ²˜λ¦¬ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λͺ¨λ“  κ·œμΉ™μ— μ μ ˆν•œ 곡백을 λͺ¨λ‘ μ‚½μž…ν•  수 μžˆλ„λ‘ 문법을 이해해야 ν•˜λŠ” 것을 κ±±μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(μ•½ 126개의 ν”„λ‘œλ•μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€...) 이것을 ν•  수 μžˆλŠ” λ‹€λ₯Έ 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

주의: 문법을 μ†μœΌλ‘œ μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” 경우 Google 그룹슀 λͺ©λ‘μ˜ 티켓에 μžˆλŠ” λͺ‡ 가지 μ§ˆλ¬Έμ— λŒ€ν•œ 도움을 μš”μ²­ν–ˆμŠ΅λ‹ˆλ‹€. http://groups.google.com/group/pegjs/browse_thread/thread/568b629f093983b7

κ°μ‚¬ν•©λ‹ˆλ‹€!

Google 그룹슀의 μ‚¬λžŒλ“€μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. λ‚˜λŠ” λ‚΄κ°€ μ›ν•˜λŠ” 것을 ν•  수 μžˆλ„λ‘ μΆ©λΆ„ν•œ 정보λ₯Ό μ–»μ—ˆλ‹€κ³  μƒκ°ν•œλ‹€.

ν•˜μ§€λ§Œ PEG.jsμ—μ„œ 곡백/주석을 μ™„μ „νžˆ λ¬΄μ‹œν•  수 μžˆλŠ” κ²ƒμœΌλ‘œ ν‘œμ‹œν•˜μ—¬ κΉ¨λ—ν•œ 문법을 β€‹β€‹μˆ˜μ •ν•˜λŠ” 데 λͺ‡ μ‹œκ°„μ΄ 걸리지 μ•Šλ„λ‘ ν•˜λŠ” κΈ°λŠ₯을 정말 κΈ°λŒ€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€... κ°μ‚¬ν•©λ‹ˆλ‹€!

λΆ€μž

λ‚˜λŠ” pegjsκ°€ 토큰을 κ±΄λ„ˆλ›Έ 수 μžˆλŠ” κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€λŠ” μ£Όμž₯에 λ™μ˜ν•©λ‹ˆλ‹€. μ§„μ§€ν•œ 문법을 β€‹β€‹μž‘μ„±ν•˜κ³  μ‹Άλ‹€λ©΄ λͺ¨λ“  토큰 사이에 wsλ₯Ό 넣을 λ•Œ 미쳐버릴 κ²ƒμž…λ‹ˆλ‹€.

μƒμ„±λœ νŒŒμ„œλŠ” λͺ¨λ“ˆμ‹μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ λ‹¨μˆœν•œ λ ‰μ„œλ₯Ό λ§Œλ“€κ³  κ·Έ 좜λ ₯을 for-real에 λŒ€ν•œ μž…λ ₯으둜 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

elideWS.pegjs:

s = μž…λ ₯:(곡백문자/ν…μŠ€νŠΈλ¬Έμž)*
{
λ³€μˆ˜ κ²°κ³Ό = "";

for(var i = 0;i < input.length;i++) κ²°κ³Ό += μž…λ ₯[i];
λ°˜ν™˜ κ²°κ³Ό;
}

whitespaceCharacter = [ nt] { λ°˜ν™˜ ""; }
textCharacter = c:[^ nt] { return c; }

ν•˜μ§€λ§Œ 곡백이 ꡬ뢄 기호일 λ•Œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ‹λ³„μžμ˜ 경우

이 λ¬Έμ œμ— 자주 λΆ€λ”ͺνž™λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 쒋은 λ ‰μ„œλ₯Ό μž‘μ„±ν•˜λŠ” 것은 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€(초기 λ¬Έλ²•μ˜ 쒋은 덩어리λ₯Ό λ³΅μ œν•˜μ—¬ μΌκ΄€λœ λ ‰μ„œλ₯Ό κ°€μ§ˆ 수 있음).

λ‚΄κ°€ μƒκ°ν•œ 것은 μΌμΉ˜ν•˜λŠ” ν•­λͺ©μ΄ 없을 λ•Œλ§ˆλ‹€ λŒ€μ•ˆμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” κ±΄λ„ˆλ›°κΈ° κ·œμΉ™μ„ μ •μ˜ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 κ·ΈλŸ¬λ‚˜ non-breaking ν΄λž˜μŠ€μ— λŒ€ν•œ ν•„μš”μ„±μ„ μ†Œκ°œν•©λ‹ˆλ‹€. 뢀동 μ†Œμˆ˜μ μ„ μ‚¬μš©ν•˜λŠ” arithmetics.pegjs 예

  = Term (("+" / "-") Term)*

Term
  = Factor (("*" / "/") Factor)*

Factor
  = "(" Expression ")"
  / Float

Float "float"
  = "-"? # [0-9]+ # ("." # [0-9]+) // # means that skip rules cannot match

// skip rule marked by "!="
// skip rules cannot match the empty string
_ "whitespace"
  != [ \t\n\r]+

아직 μ†Œν™” μ€‘μž…λ‹ˆλ‹€. 아무 ν”Όλ“œλ°±? μ•„μ£Ό 어리석은 생각일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 차이점은 전체 엔진이
λ ‰μ„œ λͺ¨λ“œ(곡백이 μ€‘μš”ν•¨)μ—μ„œ μž‘λ™ν•˜κ³  그렇지 μ•Šμ„ λ•Œ(곡백은
λ¬΄μ‹œ).

λ ‰μ„œ λͺ¨λ“œμ—μ„œ 곡백을 λ¬΄μ‹œν•˜κ³  싢지 μ•Šμ€ κ²½μš°κ°€ μžˆμŠ΅λ‹ˆκΉŒ?
μ˜΅μ…˜μœΌλ‘œ? λ˜λŠ” λ°˜λŒ€λ‘œ μ •κ·œμ‹ μ•ˆμ— μžˆμ§€ μ•Šμ„ λ•Œ? λ‚˜λŠ” μ•„λ‹ˆλΌκ³  μƒκ°ν•œλ‹€.

λ‹€μŒμ€ λ™λ“±ν• κΉŒμš”?

λœ¨λ‹€
"-?[0-9]+("." [0-9]+)"

λ˜λŠ” 그렇지 μ•ŠμœΌλ©΄ 일반적인 μ •κ·œμ‹μ„ 직접 및 μ™ΈλΆ€μ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ 페그λ₯Ό ν™•μž₯ν•©λ‹ˆλ‹€.
λ”°μ˜΄ν‘œλ‘œ 묢인 λ¬Έμžμ—΄(μ •κ·œμ‹ 포함) 곡백은 λ¬΄μ‹œλ©λ‹ˆλ‹€.

2014λ…„ 4μ›” 19일 μ˜€ν›„ 3μ‹œ 22뢄에 Andrei Neculau [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œμ— 자주 λΆ€λ”ͺνž™λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 쒋은 λ ‰μ„œλ₯Ό μž‘μ„±ν•˜λŠ” 것은 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€(초기 λ¬Έλ²•μ˜ 쒋은 덩어리λ₯Ό λ³΅μ œν•˜μ—¬ μΌκ΄€λœ λ ‰μ„œλ₯Ό κ°€μ§ˆ 수 있음).

λ‚΄κ°€ μƒκ°ν•œ 것은 μΌμΉ˜ν•˜λŠ” ν•­λͺ©μ΄ 없을 λ•Œλ§ˆλ‹€ λŒ€μ•ˆμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” κ±΄λ„ˆλ›°κΈ° κ·œμΉ™μ„ μ •μ˜ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 κ·ΈλŸ¬λ‚˜ non-breaking ν΄λž˜μŠ€μ— λŒ€ν•œ ν•„μš”μ„±μ„ μ†Œκ°œν•©λ‹ˆλ‹€. Floatsλ₯Ό μ‚¬μš©ν•˜λŠ” arithmetics.pegjs의 예

ν‘œν˜„
= κΈ°κ°„(("+" / "-") κΈ°κ°„)*

μš©μ–΄
= 인수(("_" / "/") 인수)_

μš”μΈ
= "(" 식 ")"
/ λœ¨λ‹€

ν”Œλ‘œνŠΈ "ν”Œλ‘œνŠΈ"
= "-"? # [0-9]+ # ("." # [0-9]+) // # κ±΄λ„ˆλ›°κΈ° κ·œμΉ™μ΄ μΌμΉ˜ν•  수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

// "!="둜 ν‘œμ‹œλœ κ·œμΉ™ κ±΄λ„ˆλ›°κΈ°
// κ±΄λ„ˆλ›°κΈ° κ·œμΉ™μ€ 빈 λ¬Έμžμ—΄κ³Ό μΌμΉ˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
_ "곡백"
!= [tnr]+
아직 μ†Œν™” μ€‘μž…λ‹ˆλ‹€. 아무 ν”Όλ“œλ°±? μ•„μ£Ό 어리석은 생각일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.

@waTeim 사싀 μ•„λ‹™λ‹ˆλ‹€.

μ „ν†΅μ μœΌλ‘œ νŒŒμ‹± ν”„λ‘œμ„ΈμŠ€λŠ” λ ‰μ‹±κ³Ό νŒŒμ‹±μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€. λ ‰μ‹±ν•˜λŠ” λ™μ•ˆ 곡백을 ν¬ν•¨ν•œ λͺ¨λ“  λ¬Έμžκ°€ μ€‘μš”ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것듀은 "폐기" ν† ν°μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€. νŒŒμ„œλŠ” λ‹€μŒ ν† ν°μœΌλ‘œ 진행할 λ•Œ 폐기 토큰을 λ²„λ¦½λ‹ˆλ‹€. μ€‘μš”ν•œ 뢀뢄은 곡백뿐만 μ•„λ‹ˆλΌ 무엇이든 버릴 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 λ™μž‘μ€ μ •ν™•νžˆ @andreineculau κ°€ μ„€λͺ…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이λ₯Ό κ΅¬ν˜„ν•˜λŠ” κΈ°λ³Έ μ•„μ΄λ””μ–΄λŠ” ν•œ μƒνƒœμ—μ„œ λ‹€μŒ μƒνƒœλ‘œ μ „ν™˜ν•  λ•Œ λͺ¨λ“  폐기 κ·œμΉ™μ— λŒ€ν•΄ μΆ”κ°€λ‘œ 확인해야 ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

2014λ…„ 4μ›” 23일 μ˜€ν›„ 2μ‹œ 54뢄에 Sean Farrell [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

@waTeim 사싀 μ•„λ‹™λ‹ˆλ‹€.

κ·Έλž˜μ„œ μš°λ¦¬λŠ” λ™μ˜ν•©λ‹ˆλ‹€. 전톡적인 μ ‘κ·Ό λ°©μ‹μœΌλ‘œ μΆ©λΆ„ν•©λ‹ˆλ‹€. κ°€μ§ˆ ν•„μš”κ°€ μ—†λ‹€
μ—„κ²©ν•˜κ²Œ νŒŒμ„œ 뢀뢄은 폐기된 ν† ν°μ˜ 쑴재λ₯Ό μΈμ‹ν•˜κ³ 
λ ‰μ„œ 뢀뢄이 μ‘°κ±΄λΆ€λ‘œ λ™μž‘ν•˜λ„λ‘ λ§Œλ“€ μ΄μœ κ°€ μ—†μŠ΅λ‹ˆλ‹€(λ¬Έλ§₯에 λ―Όκ°ν•œ λ°©μ‹μœΌλ‘œ)
wrt 인식 토큰.

λ”°λΌμ„œ 언어에 글루 μš”μ†Œ(예: '#')κ°€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
κ·Έκ²ƒμœΌλ‘œ μΆ©λΆ„ν•˜κΈ° λ•Œλ¬Έμ—

1) 토큰은 μ •κ·œμ‹μ—μ„œλ§Œ λ§Œλ“€ 수 있으며 μ»¨ν…μŠ€νŠΈμ— λ―Όκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
2) 토큰은 μ˜ˆμ™Έ 없이 νκΈ°λ˜λ„λ‘ ν‘œμ‹œλ  수 μžˆμŠ΅λ‹ˆλ‹€.

μ „ν†΅μ μœΌλ‘œ νŒŒμ‹± ν”„λ‘œμ„ΈμŠ€λŠ” λ ‰μ‹±κ³Ό νŒŒμ‹±μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€. λ ‰μ‹±ν•˜λŠ” λ™μ•ˆ 곡백을 ν¬ν•¨ν•œ λͺ¨λ“  λ¬Έμžκ°€ μ€‘μš”ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것듀은 "폐기" ν† ν°μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€. νŒŒμ„œλŠ” λ‹€μŒ ν† ν°μœΌλ‘œ 진행할 λ•Œ 폐기 토큰을 λ²„λ¦½λ‹ˆλ‹€. μ€‘μš”ν•œ 뢀뢄은 곡백뿐만 μ•„λ‹ˆλΌ 무엇이든 버릴 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 λ™μž‘μ€ μ •ν™•νžˆ @andreineculau κ°€ μ„€λͺ…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이λ₯Ό κ΅¬ν˜„ν•˜λŠ” κΈ°λ³Έ μ•„μ΄λ””μ–΄λŠ” ν•œ μƒνƒœμ—μ„œ λ‹€μŒ μƒνƒœλ‘œ μ „ν™˜ν•  λ•Œ λͺ¨λ“  폐기 κ·œμΉ™μ— λŒ€ν•΄ μΆ”κ°€λ‘œ 확인해야 ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.

μ’‹μ•„, 그럼 λ‚΄κ°€ 당신을 잘λͺ» μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€. λ ‰μ„œ μƒνƒœμ— λŒ€ν•œ κ²½μš°κ°€ μžˆμ„ 수 μžˆμ§€λ§Œ μ΄λŠ” μ™„μ „νžˆ λ‹€λ₯Έ μš”κ΅¬ 사항이며 peg.js λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ IMHOμž…λ‹ˆλ‹€.

@waTeim @rioki 제 μ œμ•ˆμ€

이 κ·œμΉ™μ„ λ”°λ₯΄μ‹­μ‹œμ˜€ . *WS λ₯Ό μ œκ±°ν•˜μ—¬ κ·œμΉ™μ˜ 문법을 λ‹¨μˆœν™”ν•˜λ €λ©΄ field_name 와 : 사이에 field_name *WS ν—ˆμš©ν•˜μ§€ μ•Šλ„λ‘ PEGjs 에 μ–΄λ–»κ²Œ μ§€μ‹œν•˜κ² μŠ΅λ‹ˆκΉŒ?

@andreineculau λ‹Ήμ‹ μ˜ 문법은 곡백에 λ―Όκ°ν•˜κΈ° λ•Œλ¬Έμ— 이것은 μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 폐기 토큰은 λ¬Έλ²•μ˜ 일뢀, μ •ν™•ν•œ μ–΄νœ˜ 뢀뢄이 될 κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 큰 λ¬Έμ œκ°€ 무엇인지 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. 이것은 이미 70λ…„λŒ€μ— μΆ©λΆ„νžˆ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  μ–Έμ–΄μ—λŠ” κ±΄λ„ˆλ›Έ 수 μžˆλŠ” κ³ μœ ν•œ 토큰과 적용 κ°€λŠ₯ν•œ μœ„μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. 곡백과 주석은 μ–Έμ–΄ μ •μ˜μ˜ λ§Žμ€ 뢀뢄이며 λ”°λΌμ„œ λ¬Έλ²•μ˜ μΌλΆ€μž…λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—μ„œ κ±΄λ„ˆλ›Έ 수 μžˆλŠ” 토큰은 λ‹€λ₯Έ λͺ¨λ“  토큰 사이에 μžˆμ„ 수 있으며 폐기 κ·œμΉ™μ„ μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  κ·œμΉ™μ— λŒ€ν•΄ expr = WS lit WS op WS expr WS ";" λ₯Ό μž‘μ„±ν•˜λŠ” 것보닀 훨씬 κ°„λ‹¨ν•©λ‹ˆλ‹€. 곡백 μ²˜λ¦¬κ°€ μžˆλŠ” C와 같은 문법을 상상해 λ³΄μ„Έμš”.

폐기 κ·œμΉ™μ„ pegjs둜 λ‹€μ‹œ κ΅¬μ„±ν•˜λŠ” 것이 쉽지 μ•Šλ‹€λŠ” 것을 μ΄ν•΄ν•˜μ§€λ§Œ 그것이 μΉ­μ°¬ν•  λ§Œν•œ λͺ©ν‘œκ°€ μ•„λ‹ˆλΌλŠ” μ˜λ―ΈλŠ” μ•„λ‹™λ‹ˆλ‹€.

였, 무료 응닡 μ„Ήμ…˜! 할말이 λ§Žμ€λ° λ„ˆλ¬΄ κΈΈμ–΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€.

1) TL;DR μ‚¬λžŒλ“€μ„ μœ„ν•΄ 페그 μš”μ†Œλ₯Ό μΆ”κ°€ ν•  수 μžˆλ‹€λ©΄ λ‹€μŒκ³Ό 같이 μž‘μ„±ν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€.

header_field
= field_name ":" field_value

곡백(λ¬΄μ‹œ)
= [t]+

λ‚΄κ°€ μΆ”κ°€ν•  것은 λͺ¨λ“  ν”„λ‘œλ•μ…˜μ— 포함될 수 μžˆλŠ” μ˜΅μ…˜ μ„Ήμ…˜μž…λ‹ˆλ‹€.

http-bis μ–Έμ–΄λŠ” 이 μž¬μž‘μ„±μœΌλ‘œ μ œν•œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(뢀둝 a μ°Έμ‘°).

2) μ œμ•ˆλœ #에 λŒ€ν•œ λ‚˜μ˜ 문제

μ‚¬μš©μžκ°€ νŒŒμ„œ μ •μ˜λ₯Ό 무리둜 μ±„μš°λ„λ‘ μš”κ΅¬ν•˜λŠ” 것과 κ΅ν™˜ν•˜λŠ” κ²ƒμ²˜λŸΌ λŠκ»΄μ§‘λ‹ˆλ‹€.
μ‚¬μš©μžκ°€ μ±„μš°λ„λ‘ μš”κ΅¬ν•˜λŠ” λΉ„ 터미널(일반적으둜 곡백/κ΅¬λΆ„μž) 폐기
"여기에 μžˆλŠ” λ¬ΈμžλŠ” 버리지 μ•ŠμŠ΅λ‹ˆλ‹€" 메타 λ¬Έμžκ°€ ν¬ν•¨λœ νŒŒμ„œ μ •μ˜
λΆˆν•„μš”ν•˜κ²Œ. λ¬Όλ‘  이런 κ²½μš°λŠ” 더 적을 κ²ƒμž…λ‹ˆλ‹€. ν•˜λŠ” κ²½μš°λŠ” λ“œλ¬Όλ‹€.
μ‚¬λžŒλ“€μ€ μ‹€μ œλ‘œ ꡬ뢄 기호λ₯Ό μ‚¬μš©ν•˜κ³  ꡬ뢄 기호둜 무언가λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

뢀둝, HTTP-bisλŠ” κ·ΈλŸ¬ν•œ λ°œμƒ 쀑 ν•˜λ‚˜κ°€ μ•„λ‹ˆλ©° λ¬Έμ„œκ°€ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

3) μ‚¬μš©μž μ •μ˜ νŒŒμ„œ μƒνƒœ

κ·ΈλŸ¬λ‚˜ νŒŒμ„œ μ •μ˜μžκ°€ λ‹¨μˆœνžˆ μž˜λΌλ‚΄μ–΄ λΆ™μ—¬ λ„£λŠ” 것이 μ–Όλ§ˆλ‚˜ μ‰¬μš΄μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
μ •μ˜μ˜ μ–Έμ–΄ μ‚¬μ–‘μ΄λ―€λ‘œ 이와 같은 것이 μžˆμ–΄μ•Ό ν•˜λŠ” 경우
이것은 Sean이 μ•žμ„œ μ–ΈκΈ‰ν•œ μ–΄νœ˜ μƒνƒœλ‘œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ ν•  것 κ°™μ•„
λ‹€μŒ λ°©λ²•μœΌλ‘œ.

생산1(μƒνƒœ==1)
= 물건

생산2(μƒνƒœ==2)
= 물건

생산3
= 물건 {μƒνƒœ = 1}

생산4
= 물건 {μƒνƒœ = 2}

즉, lex/yacc와 λ§ˆμ°¬κ°€μ§€λ‘œ ν”„λ‘œλ•μ…˜μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹œμŠ€ν…œμ΄ νŠΉμ • μƒνƒœμ— μžˆλŠ” 경우 μ‚¬μš©μžκ°€ ν•΄λ‹Ή μƒνƒœ 값을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4) 더 λ§Žμ€ μ˜΅μ…˜

λ˜λŠ” μ‚¬μš©μžμ—κ²Œ 더 μ‰½κ²Œ λ§Œλ“€ 수 있고 λ‹€λ₯Έ
μ˜΅μ…˜

생산(DONTIGNORE)
= 물건

μ΄λ ‡κ²Œ ν•˜λ©΄ νŒŒμ„œκ°€ ν‘œμ‹œλœ 토큰을 λ²„λ¦¬λŠ” κΈ°λ³Έ μž‘μ—…μ„ μž¬μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
ν•˜λ‚˜μ˜ 생산에 λŒ€ν•΄μ„œλ§Œ νκΈ°λ©λ‹ˆλ‹€. 이것은 3κ³Ό λ™μΌν•˜μ§€λ§Œ 더 μ‰½μŠ΅λ‹ˆλ‹€.
읽닀. 이것은 생산이 λͺ¨λ‘ λ¬΄μ‹œλ˜κΈ° λ•Œλ¬Έμ— # μ œμ•ˆλ³΄λ‹€ 덜 μœ μ—°ν•©λ‹ˆλ‹€.

λ˜λŠ” λ¬΄μ‹œν•˜μ§€ μ•Šμ§€λ§Œ μΆ”κ°€ μœ μ—°μ„±μ΄ ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

5) getNextToken()에 λ§€κ°œλ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜λ©΄ μ»¨ν…μŠ€νŠΈ 민감도가 ν—ˆμš©λ©λ‹ˆλ‹€.

λ‚˜λŠ” 이 λͺ¨λ“  것이 ν˜„μž¬ (μ—¬κΈ°μ„œ λͺ‡ 가지 가정을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.)
νŒŒμ„œ 뢀뢄이 getNextToken(input)을 ν˜ΈμΆœν•˜κ³  λŒ€μ‹  λ°œμƒν•΄μ•Ό ν•˜λŠ” 것은 λ‹€μŒμ„ μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ§€κ°œλ³€μˆ˜ getNextToken(input,options).

뢀둝 a) ν•΄λ‹Ή HTTP-bis 사양

μ’‹μ•„, λ‚˜λŠ” λͺ‡λͺ‡μ„ μ½μ—ˆμ§€λ§Œ 이 λͺ¨λ“  것을 μ½μ§€λŠ” μ•Šμ•˜λ‹€

ν•˜μ΄νΌν…μŠ€νŠΈ 전솑 ν”„λ‘œν† μ½œ(HTTP/1.1): λ©”μ‹œμ§€ ꡬ문 및 λΌμš°νŒ…
λ“œλž˜ν”„νŠΈ-ietf-httpbis-p1-messaging-26

λ‚˜λŠ” 그듀이 문법을 μ •μ˜ν•˜λŠ” 방식을 μ’‹μ•„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μž…λ ₯을 λ³€κ²½ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
μˆ˜λ½ν•˜μ§€λ§Œ λ‚˜λŠ” 그듀이 ν•œ κ²ƒμ²˜λŸΌ μ •μ˜ν•˜μ§€ μ•Šμ•˜μ„ κ²ƒμž…λ‹ˆλ‹€. 특히, λ‚˜λŠ” 그듀이 μ™œ
λͺ¨λ‘ μ •ν™•νžˆ λ™μΌν•œ λ¬Έμžμ—΄κ³Ό λ™μΌν•œ μ •μ˜λœ OWS 및 RWS 및 BWS
κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ λ§₯λ½μ—μ„œ. 그듀은 μ •μ˜

OWS ::== (SP | HTAB)*
RWS ::== (SP | HTAB)+
BWS ::== OWS

νƒ­κ³Ό 곡백의 λ°˜λ³΅μž…λ‹ˆλ‹€.

μ΄μœ κ°€ μ—†μŠ΅λ‹ˆλ‹€. 그듀은 μ–Έμ–΄λ₯Ό ꡬ문 λΆ„μ„ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ–΄νœ˜ 뢄석기가 ν•„μš”ν•©λ‹ˆλ‹€.
μ»¨ν…μŠ€νŠΈλ₯Ό μΆ”μ ν•˜κΈ° μœ„ν•΄ - 그리고 그듀은 κ·Έλ ‡κ²Œ ν•  ν•„μš”κ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

그듀은 OWSλ₯Ό "선택적 곡백"으둜 μ •μ˜ν–ˆμŠ΅λ‹ˆλ‹€. BWSλŠ” "λ‚˜μœ 곡백" λ˜λŠ” 그렇지 μ•ŠμœΌλ©΄ 선택적인 κ²ƒμœΌλ‘œ μ •μ˜ν–ˆμŠ΅λ‹ˆλ‹€.
κ³΅λ°±μ΄μ§€λ§Œ ν•„μš”ν•˜μ§€ μ•Šμ€ "λ‚˜μœ" μ»¨ν…μŠ€νŠΈμ—μ„œ RWSλŠ” 곡백이 ν•„μš”ν•œ μœ„μΉ˜μ— 곡백을 μš”κ΅¬ν–ˆμŠ΅λ‹ˆλ‹€.
토큰을 κ΅¬λΆ„ν•˜λŠ” 데 ν•„μš”ν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ νŒŒμ„œκ°€ μžˆμ„ 수 μžˆλ‹€λŠ” 것을 μ œμ™Έν•˜κ³  이 곡백은 어디에도 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
BWS("λΆˆν•„μš”ν•œ ν›„ν–‰ 곡백 감지" λ“±)와 μΌμΉ˜ν•˜λŠ” 경우 κ²½κ³ 
ꡬ뢄 κΈ°ν˜ΈλŠ” μ–΄μ¨Œλ“  ν•©λ‹ˆλ‹€.

κ·Έλ“€μ˜ μ‚¬μ–‘μ—μ„œ RWSκ°€ μ‚¬μš©λ˜λŠ” μœ μΌν•œ μž₯μ†ŒλŠ” μ—¬κΈ°μž…λ‹ˆλ‹€.

Via = 1#( [ RWS 주석 ]에 μ˜ν•΄ μˆ˜μ‹ λœ ν”„λ‘œν† μ½œ RWS μˆ˜μ‹ )

 received-protocol = [ protocol-name "/" ] protocol-version
                     ; see Section 6.7
 received-by       = ( uri-host [ ":" port ] ) / pseudonym
 pseudonym         = token

κ·ΈλŸ¬λ‚˜ 'ν”„λ‘œν† μ½œ 버전'은 μˆ«μžμ™€ 문자일 수 μžˆλŠ” 반면 'μˆ˜μ‹ μž'λŠ” μˆ«μžμ™€ λ¬Έμžμž…λ‹ˆλ‹€. λ‹€μ‹œ 말해,
μ–΄νœ˜ λΆ„μ„κΈ°λŠ” 곡백으둜 κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ” ν•œ 이 두 뢀뢄을 μ˜¬λ°”λ₯΄κ²Œ μΈμ‹ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.
그리고 RWSκ°€ 적어도 1이 μ•„λ‹Œ 경우 λͺ…μ‹œμ μœΌλ‘œ μ‹λ³„λ˜λŠ” RWSκ°€ μžˆκ±°λ‚˜ μ—†λŠ” ꡬ문 였λ₯˜κ°€ 될 κ²ƒμž…λ‹ˆλ‹€.
곡백 문자. λ”°λΌμ„œ ν”„λ‘œλ•μ…˜μ—μ„œ RWSλ₯Ό μ™„μ „νžˆ μ œκ±°ν•˜κ³  곡백을 μ²˜λ¦¬ν•˜μ‹­μ‹œμ˜€.
μ–΄λ””μ—μ„œλ‚˜ κ΅¬λΆ„μžλ‘œ μ‚¬μš©λ˜λ©° μ–Έμ–΄λŠ” λ³€κ²½λ˜μ§€ μ•Šκ³  λ¬Έμ„œν™”λœ λ°©μ‹λ§Œ λ³€κ²½λ©λ‹ˆλ‹€.

2014λ…„ 4μ›” 24일 μ˜€ν›„ 1μ‹œ 23뢄에 Andrei Neculau [email protected] 은 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

@waTeim @rioki 제 μ œμ•ˆμ€

이 κ·œμΉ™μ„ λ”°λ₯΄μ‹­μ‹œμ˜€. OWSλ₯Ό μ œκ±°ν•˜μ—¬ κ·œμΉ™μ˜ 문법을 λ‹¨μˆœν™”ν•˜λ €λ©΄ field_nameκ³Ό : μ‚¬μ΄μ—μ„œ OWSλ₯Ό ν—ˆμš©ν•˜μ§€ μ•Šλ„λ‘ PEGjs에 μ–΄λ–»κ²Œ μ§€μ‹œν•˜κ² μŠ΅λ‹ˆκΉŒ?

β€”
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.

@waTeim λ‚˜λŠ” 당신이

νŒŒμ„œμ—μ„œ νŒŒμƒλœ λ ‰μ„œ μƒνƒœμ˜ μ μ ˆν•œ μ‚¬μš©μ„ λ³Έ 적이 μ—†μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ 근본적인 λ¬Έμ œλŠ” νŒŒμ„œκ°€ μƒνƒœλ₯Ό μ „ν™˜ν•˜κΈ° μœ„ν•΄ 토큰을 λ³Ό λ•Œ 사전에 ν•œ 번만 λ³Ό λ•Œ λ ‰μ„œκ°€ 이미 λ‹€μŒ 토큰을 잘λͺ» λ ‰μ‹±ν–ˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 당신이 μ œμ•ˆν•œ 것은 역좔적 없이 κ΅¬ν˜„ν•˜λŠ” 것이 거의 λΆˆκ°€λŠ₯ν•˜λ©° μ΄λŠ” νŒŒμ„œμ—μ„œ κ²°μ½” 쒋은 κΈ°λŠ₯이 μ•„λ‹™λ‹ˆλ‹€.

문법을 μž‘μ„±ν•  λ•Œ 기본적으둜 μ–΄λ–€ 생산물이 ꡬ문 λΆ„μ„λ˜κ³  무엇을 λ§ˆμ‹€ 수 μžˆλŠ”μ§€ μ •μ˜ν•©λ‹ˆλ‹€. @andreineculau 의 μ˜ˆμ—λŠ” νŒŒμ„œμ—μ„œ 곡백을 μ²˜λ¦¬ν•˜κ±°λ‚˜ ν† ν°μ˜ ν›„ν–‰ ":" 뢀뢄을 μ •μ˜ν•˜λŠ” 두 가지 μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. ( [a-zA-Z0-9!#$%&'+-.^_|~]+ ":" ).

문제λ₯Ό λΈ”λž™λ¦¬μŠ€νŠΈ λŒ€μ‹  ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ(μ–΄λ–€ 뢀뢄을 μΊ‘μ²˜ν•˜κ³  λ³€ν™˜ν•˜κ³  싢은지)λ₯Ό μ§€μ •ν•˜λ„λ‘ μ œμ•ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€. 곡백은 ν˜„μž¬ 캑처 μ‹œμŠ€ν…œμ˜ ν•œ 가지 λ¬Έμ œμ΄μ§€λ§Œ κ·œμΉ™μ˜ 쀑첩은 또 λ‹€λ₯Έ λ¬Έμ œμž…λ‹ˆλ‹€. λ‚΄κ°€ Issue #66μ—μ„œ

μΊ‘μ²˜μ™€ κ΄€λ ¨ν•˜μ—¬ LPeg와 PEG.js의 κ°„λ‹¨ν•œ μ˜ˆλŠ” 문제 #66의 λ‚΄ μ˜κ²¬μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. 이름이 μ•½κ°„ μ• λ§€ν•˜κΈ΄ ν•˜μ§€λ§Œ, 주어진 ν”„λ‘œλ•μ…˜(λ˜λŠ” κ·Έ 일뢀)을 μΊ‘μ²˜ν•˜κ±°λ‚˜ λ³€ν™˜ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ 방법에 λŒ€ν•΄μ„œλŠ” LPeg λ¬Έμ„œμ˜ 캑처 μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ•ˆλ…•ν•˜μ„Έμš”, null , undefined 및 곡백 기호만 μžˆλŠ” λ¬Έμžμ—΄κ³Ό 같은 일반적인 경우λ₯Ό λ¬΄μ‹œ ν•˜λŠ” μŠ€λ‹ˆνŽ« 을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.
λ‹€μŒκ³Ό 같이 문법 파일의 ν—€λ“œμ— ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

{
  var strip = require('./strip-ast');
}

이λ₯Ό κ°œμ„ ν•˜λŠ” 두 가지 방법:

  • μš©μ–΄μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜ ν•„ν„° - νŠΉμ • 문법이 ν•„μš”ν•œ νŠΉμ • μš©μ–΄λ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€.
  • μ€‘μ²©λœ 빈 λ°°μ—΄ κ±΄λ„ˆλ›°κΈ° β€” strip λ‹€μŒ 두 번째 λ‹¨κ³„μ—μ„œ μˆ˜ν–‰ν•  수 있으며 μ€‘μ²©λœ 빈 λ°°μ—΄μ˜ Β«ν”ΌλΌλ―Έλ“œΒ»λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
    관심 μžˆλŠ” μ‚¬λžŒμ΄ 있으면 νŒ¨ν‚€μ§€λ‘œ μ—…κ·Έλ ˆμ΄λ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@richb-hanover ASN.1 μ •μ˜ νŒŒμ„œ λ…Έλ ₯은 μ–΄λ””μ—μ„œ μ΄λ£¨μ–΄μ‘ŒμŠ΅λ‹ˆκΉŒ?

@atesgoral - νƒˆμΆœν–ˆμŠ΅λ‹ˆλ‹€. "μ‹€μ œ νŒŒμ„œ"κ°€ ν•„μš”ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λŒ€μƒ νŒŒμΌμ—μ„œ νŠΉμ • λͺ…λͺ…λœ μš”μ†Œλ§Œ λΆ„λ¦¬ν•˜λ©΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ‚˜λŠ” μ–΄λ–€ λ©μ²­ν•œ μ‚¬λžŒλ„ ν•  수 μžˆλŠ” 일을 ν–ˆμŠ΅λ‹ˆλ‹€. μ •κ·œμ‹μ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. (그리고 두 가지 λ¬Έμ œκ°€μžˆμ—ˆμŠ΅λ‹ˆλ‹€ :-)

ν•˜μ§€λ§Œ μ„±κ³΅ν–ˆκΈ° λ•Œλ¬Έμ— λ‹€μŒ λ„μ „μœΌλ‘œ λ„˜μ–΄κ°ˆ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ— ν–‰μš΄μ„ λΉ•λ‹ˆλ‹€!

chevrotainκ³Ό ν•΄λ‹Ή κ±΄λ„ˆλ›°κΈ° μ˜΅μ…˜ 을

λ„ˆλ¬΄ 자주 μš°λ¦¬λŠ” λ‹€μŒκ³Ό 같이 μ“°κ³  μžˆμŠ΅λ‹ˆλ‹€.

Pattern = head:PatternPart tail:( WS "," WS PatternPart )*
{
  return {
    type: 'pattern',
    elements: buildList( head, tail, 3 )
  };
}

λŒ€μ‹  λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆλ‹€λ©΄ λ©‹μ§ˆ κ²ƒμž…λ‹ˆλ‹€.

WS "whitespace" = [ \t\n\r] { return '@<strong i="11">@skipped</strong>' }

IgnoredComma = "," { return '@<strong i="12">@skipped</strong>' }

Pattern = head:PatternPart tail:( WS IgnoredComma WS PatternPart )*
{
  return {
    type: 'pattern',
    elements: [head].concat(tail)
  };
}

@richb-hanover, 그리고 λΉ„μŠ·ν•œ μš”κ΅¬ 사항을 μ°Ύμ•„ μ—¬κΈ°κΉŒμ§€ 온 λ‹€λ₯Έ μ‚¬λžŒλ“€μ„ μœ„ν•΄ λ‚˜λ„ κ²°κ΅­ λ‚΄ μžμ‹ μ˜ νŒŒμ„œλ₯Ό μž‘μ„±ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€: https://www.npmjs.com/package/asn1exp 및 https://www.npmjs. com/package/asn1-tree

κ±΄λ„ˆλ›°κΈ°λŠ” es6 symbol μ‚¬μš©ν•˜μ—¬ 비ꡐ적 μ‰½κ²Œ κ΅¬ν˜„ν•˜κ±°λ‚˜ ꡬ문 뢄석 μ‹œ ꡬ문 뢄석기에 μˆ μ–΄λ₯Ό μ „λ‹¬ν•˜μ—¬ 더 였래 지속할 수 μžˆμŠ΅λ‹ˆλ‹€(ν›„μžμ˜ μ˜΅μ…˜μ„ μ„ ν˜Έν•¨)

이것 μ—­μ‹œ μš°μ—°νžˆ λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.
PEG.js의 내뢀에 λŒ€ν•΄ 아무것도 λͺ¨λ₯΄κ³ , κ·Έλƒ₯ 거기에 뼈λ₯Ό λ˜μ‘ŒμŠ΅λ‹ˆλ‹€...

κ·œμΉ™μ„ μž‘μ„±ν•  λ•Œ κ·œμΉ™μ˜ 끝에 λ°˜ν™˜ 블둝을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
ν•΄λ‹Ή λΈ”λ‘μ—μ„œ text() 및 location() 와 같은 것을 ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄λΆ€ κΈ°λŠ₯μž…λ‹ˆλ‹€.

μ½”λ“œμ˜ μ–΄λ”˜κ°€μ— ν•΄λ‹Ή λΈ”λ‘μ˜ λ°˜ν™˜ 값이 좜λ ₯ 슀트림으둜 λ“€μ–΄κ°‘λ‹ˆλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή 값이 skip 둜컬 ν•¨μˆ˜ 호좜의 λ°˜ν™˜μΈ 경우 κ·œμΉ™μ— μ˜ν•΄ λ°˜ν™˜λœ 값을 κ±΄λ„ˆλ›°λ €λ©΄ PEG.jsμ—μ„œ 무엇을 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

예: comment = "//" space ([^\n])* newline { return skip() }

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ skip()은 Symbol을 λ°˜ν™˜ν•  수 있으며, 그런 λ‹€μŒ μ–΄λ”˜κ°€μ—μ„œ μ½”λ“œμ— μ˜ν•΄ κ²€μ‚¬λ˜κ³  μ œκ±°λ©λ‹ˆλ‹€.
lzhakiκ°€ λ§ν•œ 것과 λΉ„μŠ·ν•˜μ§€λ§Œ 라이브러리 λ‚΄λΆ€

λ‚˜λŠ” λ‹Ήμ‹ μ˜ μ§ˆλ¬Έμ„ μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. μ–΄λ–€ μƒν™©μ—μ„œ κ·œμΉ™μ— μ‹€νŒ¨ν•˜λŠ” 방법을 μ°Ύκ³  μžˆμŠ΅λ‹ˆκΉŒ? &{...} λ˜λŠ” !{...} ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ comment κ·œμΉ™μ˜ λ°˜ν™˜ 값을 μ‚¬μš©ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€.

seq = comment r:another_rule { return r; };
choice = (comment / another_rule) { <you need to decide what to return instead of "comment" result> };

λˆ„κ΅°κ°€μ—κ²Œ 도움이 λœλ‹€λ©΄ μ΅œμƒμœ„ κ·œμΉ™μ΄ κ²°κ³Ό 배열을 ν•„ν„°λ§ν•˜λ„λ‘ ν•˜μ—¬ 곡백을 λ¬΄μ‹œν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ:

    = prog:expression+ {return prog.filter(a => a)}

expression
    = float
    / number
    / whitespace

float
    = digits:(number"."number) {return parseFloat(digits.join(""),10)}

number 
    = digits:digit+ {return parseInt(digits.join(""),10)}

digit 
    = [0-9]

whitespace
    = [ \t\r\n] {return undefined}

이것은 κ²°κ³Ό λ°°μ—΄μ—μ„œ 곡백을 μœ μ§€ν•˜λ©΄μ„œ μž…λ ₯을 ν–‰λ³΅ν•˜κ²Œ ꡬ문 λΆ„μ„ν•©λ‹ˆλ‹€.
이것은 주석과 같은 κ²½μš°μ—λ„ μž‘λ™ν•©λ‹ˆλ‹€. κ·œμΉ™μ΄ μ •μ˜λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ λ°˜ν™˜λ˜κ³  μ΅œμƒμœ„ κ·œμΉ™μ΄ 이λ₯Ό κ±ΈλŸ¬λƒ…λ‹ˆλ‹€.

μ΄λŠ” μ΅œμƒμœ„ ν”„λ‘œλ•μ…˜μ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€. 필터링 κ°€λŠ₯ν•œ μžμ‹μ„ 포함할 수 μžˆλŠ” λͺ¨λ“  λΆ€λͺ¨λ₯Ό μˆ˜λ™μœΌλ‘œ 필터링해야 ν•©λ‹ˆλ‹€.

@StoneCypher 사싀, 일뢀 μ΅œμƒμœ„ μž‘μ—…μ΄ ν•„μš”ν•˜μ§€λ§Œ μ €μ—κ²Œ 효과적이며 κ°λ§ˆκ°€ λ„ˆλ¬΄ λ³΅μž‘ν•˜μ§€ μ•Šμ€ ν•œ μ΅œμƒμœ„ ν•„ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ λ²—μ–΄λ‚  수 μžˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

κ·Έ 외에 λ‚΄κ°€ 생각할 수 μžˆλŠ” 것은 μž…λ ₯μ—μ„œ 곡백을 ν•„ν„°λ§ν•˜κ³  λͺ¨λ“  일치 ν•­λͺ©μ„ ν†΅κ³Όμ‹œν‚€λŠ” μ΅œμƒμœ„ κΈ°λŠ₯이 μžˆλ‹€λŠ” κ²ƒλΏμž…λ‹ˆλ‹€. ν™•μ‹€νžˆ 느리고 더 λ§Žμ€ 호좜이 ν•„μš”ν•˜μ§€λ§Œ (λ‚˜μ²˜λŸΌ) λͺ¨λ“  것을 토큰 생성기에 μ „λ‹¬ν•˜λ©΄ μ‰½μŠ΅λ‹ˆλ‹€. 토큰을 μƒμ„±ν•œ κ³³μ—μ„œ ν•„ν„° κΈ°λŠ₯을 ν˜ΈμΆœν•  수 있으며 토큰 생성에 λŒ€ν•΄μ„œλ§Œ κ±±μ •ν•˜λ©΄ λ©λ‹ˆλ‹€. 곡백은 μ–΄λŠ 정도 μžλ™μœΌλ‘œ ν•„ν„°λ§λ©λ‹ˆλ‹€.

pegjs의 ν˜„μž¬ HEADμ—μ„œ λ‚΄κ°€ μ’‹μ•„ν•˜λŠ” 것 쀑 ν•˜λ‚˜λŠ” λ ˆμ΄λΈ”μ„ μƒμ„±ν•˜κ³  return 문을 μˆ˜ν–‰ν•˜μ§€ μ•Šκ³ λ„ ν•„λ“œλ₯Ό μ„ νƒν•˜λŠ” (λ¬Έμ„œν™”λ˜μ§€ μ•Šμ€) μ§€μ›μž…λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 λ³΄μž…λ‹ˆλ‹€.

foo = <strong i="6">@bar</strong> _ <strong i="7">@baz</strong>
bar = $"bar"i
baz = $"baz"i
_ = " "*
parse('barbaz') // returns [ 'bar', 'baz' ]

λ‚˜λŠ” 이것이 이 μ‚¬μš© 사둀와 λ‹€λ₯Έ λ§Žμ€ 사둀에 λŒ€ν•΄ ν›Œλ₯­ν•˜κ³  κΉ¨λ—ν•˜λ©° λͺ…μ‹œμ μΈ ꡬ문을 μ œκ³΅ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

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