Pegjs: μ‹œν€€μŠ€μ—μ„œ 단일 λ°˜ν™˜ 값을 λ‚˜νƒ€λ‚΄λŠ” κ°„κ²°ν•œ 방법 제곡

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

이것은 λ‚˜μ—κ²Œ κ½€ μΌλ°˜μ μž…λ‹ˆλ‹€. μ΄ˆκΈ°ν™” λ ˆμ΄λΈ”μ—μ„œ μ‹œν€€μŠ€μ˜ κ΄€λ ¨ λΆ€λΆ„λ§Œ λ°˜ν™˜ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 이 경우 AssignmentExpression만 μ‚¬μš©ν•©λ‹ˆλ‹€.

pattern:Pattern init:(_ "=" _ a:AssignmentExpression {return a})?

μ‹œν€€μŠ€μ—μ„œ λ‹€μŒ ν‘œν˜„μ‹λ§Œ λ°˜ν™˜ν•˜λŠ” @ ν‘œν˜„μ‹μ„ μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μœ„μ˜ μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

pattern:Pattern init:(_ "=" _ @AssignmentExpression)?

κ΄€λ ¨ 문제:

  • #427 μž‘μ—… 없이 κ·œμΉ™μ—μ„œ νŠΉμ • ν‘œν˜„μ‹μ˜ 일치 κ²°κ³Ό λ°˜ν™˜ ν—ˆμš©
  • #545 문법을 쀄이기 μœ„ν•œ κ°„λ‹¨ν•œ ꡬ문 ν™•μž₯
feature

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

이것은 이미 npm의 dev νƒœκ·Έμ— λ¦΄λ¦¬μŠ€λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?

https://www.npmjs.com/package/pegjs/v/0.11.0-dev.325

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

λ‚˜λŠ” 이것이 일반적인 λ¬Έμ œλΌλŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν•΄κ²°ν•  κ°€μΉ˜κ°€ μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ λ§ν•΄μ„œ, μΆ©λΆ„νžˆ 자주 λ°œμƒν•˜λŠ”μ§€, μ†”λ£¨μ…˜μ„ κ΅¬ν˜„ν•˜μ—¬ PEG.js에 λ³΅μž‘μ„±μ„ μΆ”κ°€ν•˜λŠ” 것을 μ •λ‹Ήν™”ν•  만큼 고톡을 μœ λ°œν•˜λŠ”μ§€ μ—¬λΆ€λŠ” ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 문제λ₯Ό 열어두고 1.0.0 이후에 κ³ λ €ν•˜λ„λ‘ ν‘œμ‹œν•˜κ² μŠ΅λ‹ˆλ‹€.

λ™μ˜. 1.0μ—μ„œ 정말 보고 μ‹ΆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” @ ꡬ문에 그닀지 μ—΄κ΄‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. IMHOλŠ” μ΄λ ‡κ²Œ ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. "μ΅œμƒμœ„ μˆ˜μ€€" λ ˆμ΄λΈ”μ΄ ν•˜λ‚˜λ§Œ μžˆλŠ” 경우 ν•΄λ‹Ή λ ˆμ΄λΈ”μ„ μ•”μ‹œμ μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μŒ λŒ€μ‹ :

rule = space* a:(text space+ otherText)+ newLine* { return a; }

당신은 얻을:

rule = space* a:(text space+ otherText)+ newLine*

그리고 λ ˆμ΄λΈ”μ΄ νŠΉλ³„νžˆ 의미 μžˆλŠ” 것이 μ•„λ‹Œ κ²½μš°μ—λ„ λ‹€μŒμ„ ν—ˆμš©ν•˜μ‹­μ‹œμ˜€.

rule = space* :(text space+ otherText)+ newLine*

λ”°λΌμ„œ λ ˆμ΄λΈ” 이름을 μ™„μ „νžˆ κ±΄λ„ˆλœλ‹ˆλ‹€.

@mulderr @ μ—°μ‚°μžκ°€ 더 λ‚«λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

@의 경우 +1 - 이것은 λ‚΄ μ½”λ“œ μ „μ²΄μ—μ„œ 많이 λ°˜λ³΅λ©λ‹ˆλ‹€.

이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λͺ‡ 가지 κ°„κ²°ν•œ 방법에 λŒ€ν•œ +1μž…λ‹ˆλ‹€.

이 고톡은 ES6이 ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” JS의 μž₯ν™©ν•œ function ꡬ문과 μœ μ‚¬ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ λΉ„μŠ·ν•œ 것이 여기에 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆκΉŒ? λ‹€μŒκ³Ό 같은 것:

rule = (space* a:(text space+ otherText) newLine*) => a

이것은 맀우 μœ μ—°ν•˜κ³  μ—¬μ „νžˆ λͺ…μ‹œμ μ΄λ©°( @wildeyes 의 관심사) ꡬ문과 κ΅¬ν˜„ λͺ¨λ‘μ—μ„œ κΈ°λ³Έ JSλ₯Ό

λ‚˜λŠ” λ‹€μŒκ³Ό 같은 것을 쑰금 μƒμƒν–ˆμŠ΅λ‹ˆλ‹€.

additive = left:multiplicative "+" right:additive {= left + right; }

μ—¬κΈ°μ„œ = (문자 선택에 λŒ€ν•΄ 자유둭게 ν† λ‘ ν•  수 있음)λŠ” 곡백이 μ•„λ‹Œ λΈ”λ‘μ˜ 첫 번째 문자둜 return .

μ΄λŠ” 전체 ν‘œν˜„μ‹μ—μ„œλ„ μž‘λ™ν•˜λ©° λ³€ν™˜ 패슀둜 κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ†Œμ‹μ΄ μžˆλ‚˜μš”? μ™œ additive = left:multiplicative "+" right:additive { => left + right } μ•„λ‹Œκ°€μš”?

이제 ν™”μ‚΄ν‘œ κΈ°λŠ₯이 μž‘λ™ν•˜λŠ” 방식( (left, right) => left + right )을 κ³ λ €ν•  λ•Œ ν™•μ‹€νžˆ μ§κ΄€μ μœΌλ‘œ 느껴질 κ²ƒμž…λ‹ˆλ‹€.

μ‹€μ œλ‘œ 이 κΈ°λŠ₯으둜 κ°œμ„ λ  parser.pegjs 파일의 μœ„μΉ˜μ— λŒ€ν•œ λͺ‡ 가지 μ˜ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄:

  = head:ActionExpression tail:(__ "/" __ ActionExpression)* {
      return tail.length > 0
        ? {
            type: "choice",
            alternatives: buildList(head, tail, 3),
            location: location()
          }
        : head;
    }

μ‹œν€€μŠ€μ—μ„œ ActionExpression의 μœ„μΉ˜μ— μ§κ΄€μ μœΌλ‘œ μ—°κ²°λ˜μ§€ μ•Šμ€ buildList 호좜의 맀직 λ„˜λ²„ 3 λ•Œλ¬Έμ— μ·¨μ•½ν•©λ‹ˆλ‹€. buildList ν•¨μˆ˜ μžμ²΄λŠ” 두 가지 λ‹€λ₯Έ μž‘μ—…μ„ κ²°ν•©ν•˜μ—¬ λ³΅μž‘ν•©λ‹ˆλ‹€. @ 식과 es6 μŠ€ν”„λ ˆλ“œ ꡬ문을 μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같이 더 κΉ”λ”ν•΄μ§‘λ‹ˆλ‹€.

  = head:ActionExpression tail:(__ "/" __ @ActionExpression)* {
      return tail.length > 0
        ? {
            type: "choice",
            alternatives: [head, ...tail],
            location: location()
          }
        : head;
    }

이것은 거의 κ΅¬λ¬Έμƒμ˜ μ„€νƒ•μ΄λ―€λ‘œ parser.pegjsμ—μ„œ ActionExpression을 μˆ˜μ •ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ 이 κΈ°λŠ₯을 νŒŒμ„œμ— μΆ”κ°€ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  = ExtractSequenceExpression
  / expression:SequenceExpression code:(__ CodeBlock)? {
      return code !== null
        ? {
            type: "action",
            expression: expression,
            code: code[1],
            location: location()
          }
        : expression;
    }

ExtractExpression
  = "@" __ expression:PrefixedExpression {
      return {
        type: "labeled",
        label: "value",
        expression: expression,
        location: location()
      };
    }

ExtractSequenceExpression
  = head:(__ PrefixedExpression)* _ extract:ExtractExpression tail:(__ PrefixedExpression)* {
      return {
        type: "action",
        expression: {
          type: "sequence",
          elements: extractList(head, 1).concat(extract, extractList(tail, 1)),
          location: location()
        },
        code: "return value;",
        location: location()
      }
    }

@ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•˜μ—¬ parser.pegjsλ₯Ό λ‹¨μˆœν™”ν•˜λŠ” 방법을 λ³΄μ—¬μ£ΌλŠ” μš”μ§€λ₯Ό ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

@ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•˜λ©΄ μ‹œν€€μŠ€μ—μ„œ μ›ν•˜λŠ” 값을 μ‰½κ²Œ μΆ”μΆœν•  수 μžˆμœΌλ―€λ‘œ extractOptional, extractList 및 buildList ν•¨μˆ˜λŠ” μ™„μ „νžˆ μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

https://gist.github.com/krisnye/a6c2aac94ffc0e222754c52d69e44b83

@krisnye ꡬ문 섀탕이 더 많이 있으면 λ‹€μŒκ³Ό 같이 ν‘œμ‹œλ©λ‹ˆλ‹€.

https://github.com/polkovnikov-ph/newpeg/blob/master/parse.np

이 ꡬ문 κΈ°λŠ₯에 :: 및 # 쑰합을 μ‚¬μš©ν•  μƒκ°μž…λ‹ˆλ‹€( #545 의 μ„€λͺ…/이유 μ°Έμ‘°).

  • :: 바인딩 μ—°μ‚°μž
  • # ν™•μž₯ μ—°μ‚°μž
// this is imported into grammar
class List extends Array {
  constructor() { this.isList = true; }
}

// grammar
number = _ ::value+ _
value = ::int #(_ "," _ ::int)* { return new List(); }
int = $[0-9]+
_ = [ \t]*
  • κ·œμΉ™μ˜ 루트 μ‹œν€€μŠ€μ—μ„œ :: λŠ” ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό κ·œμΉ™ 결과둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ€‘μ²©λœ μ‹œν€€μŠ€μ—μ„œ :: λŠ” μ€‘μ²©λœ ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό μ‹œν€€μŠ€ 결과둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • ν•˜λ‚˜ μ΄μƒμ˜ :: κ°€ μ‚¬μš©λ˜λ©΄ ν‘œμ‹œλœ ν‘œν˜„μ‹μ˜ κ²°κ³Όκ°€ λ°°μ—΄λ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€.
  • # κ°€ ν¬ν•¨λœ 쀑첩 μ‹œν€€μŠ€μ— :: 되면 κ²°κ³Όκ°€ μƒμœ„ β€‹β€‹λ°°μ—΄λ‘œ ν‘Έμ‹œλ©λ‹ˆλ‹€.
  • κ·œμΉ™μ— :: / # 와 ν•¨κ»˜ μ½”λ“œ 블둝이 μžˆλŠ” 경우 λ¨Όμ € μ‹€ν–‰ν•œ λ‹€μŒ κ²°κ³Ό push λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ κ·œμΉ™μ— 따라 09 , 55, 7 λ₯Ό μœ„μ˜ μ˜ˆμ œμ—μ„œ μƒμ„±λœ νŒŒμ„œμ— μ „λ‹¬ν•˜λ©΄ λ‹€μŒμ΄ μƒμ„±λ©λ‹ˆλ‹€.

result = [
    isList: true
    0: "09"
    1: "55"
    2: "7"
]

result instanceof Array # true in ES2015+ enviroments
result instanceof List # true

κ·œμΉ™μ˜ 루트 μ‹œν€€μŠ€μ—μ„œ ::λŠ” ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό κ·œμΉ™ 결과둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
μ€‘μ²©λœ μ‹œν€€μŠ€μ—μ„œ ::λŠ” μ€‘μ²©λœ ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό μ‹œν€€μŠ€ 결과둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ™œ 이것듀이 λΆ„λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ? μ‹œν€€μŠ€μ˜ " :: κ°€ μ‹œν€€μŠ€μ˜ 인수 κ²°κ³Όλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?"

::κ°€ ν•˜λ‚˜ 이상 μ‚¬μš©λ˜λ©΄ ν‘œμ‹œλœ ν‘œν˜„μ‹μ˜ κ²°κ³Όκ°€ λ°°μ—΄λ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€.

그건 λ‚˜μœ 생각이야. 이 경우 κ΅¬μ œν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ μœ ν˜•μ˜ 값을 λ°°μ—΄λ‘œ κ²°ν•©ν•˜λŠ” 것은 μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. (νŠœν”Œμ΄μ§€λ§Œ JSμ—μ„œλŠ” 거의 μ“Έλͺ¨κ°€ μ—†μŠ΅λ‹ˆλ‹€.)

#이 μ‹œν€€μŠ€μ— μ‚¬μš©λ˜λ©΄ κ²°κ³ΌλŠ” Array#κ°€ λΆ€λͺ¨μ˜ 배열에 μ—°κ²°λ©λ‹ˆλ‹€.

이제 그것은 λ”μ°ν•œ μƒκ°μž…λ‹ˆλ‹€. 이것은 λΆ„λͺ…νžˆ λΆˆν•„μš”ν•œ { return xs.push(x), xs } μ œκ±°ν•˜κΈ° μœ„ν•œ κ³€μ§€λ¦„μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉλ³„ν•œ 경우λ₯Ό λ§Œλ“œλŠ” 것은 μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜ν™”λœ κ·œμΉ™μ„ μ‚¬μš©ν•˜μ—¬ 일반적인 λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ—°μ‚°μžμ— μ‚¬μš©ν•  단일 문자 μ‹œν€€μŠ€λŠ” λ§Žμ§€ μ•ŠμœΌλ©° λ‚­λΉ„ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.

κ·œμΉ™μ— ::/#와 ν•¨κ»˜ μ½”λ“œ 블둝이 μžˆλŠ” 경우 λ¨Όμ € μ‹€ν–‰ν•œ λ‹€μŒ κ²°κ³Ό ν‘Έμ‹œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ f = ::"a" { return "b" } λŠ” 결과적으둜 ["a", "b"] λ₯Ό κ°€μ Έμ•Ό ν•©λ‹ˆκΉŒ?

톡과 09 . 55: 7을 μœ„μ˜ μ˜ˆμ—μ„œ μƒμ„±λœ νŒŒμ„œμ— λŒ€μž…ν•˜λ©΄ λ‹€μŒμ΄ μƒμ„±λ©λ‹ˆλ‹€.

그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. μ–ΈκΈ‰λœ . λ˜λŠ” : . μ„€λͺ…λœ λ™μž‘μ΄ κ²°κ³Όλ₯Ό μƒμ„±ν•˜λŠ” 방식도 μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

숫자 = _ ::κ°’+ _

λ˜ν•œ _ λ₯Ό μ‚¬μš©ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. ν† ν°μ˜ 였λ₯Έμͺ½ λ˜λŠ” μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©° 문법을 μœ„ν•΄ ν•œ 번 μ„ νƒλœ μͺ½μž…λ‹ˆλ‹€. 였λ₯Έμͺ½μ— μžˆλŠ” 경우 κΈ°λ³Έ κ·œμΉ™λ„ _ μ‹œμž‘ν•΄μ•Ό ν•˜λ©° κ·Έ λ°˜λŒ€μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

start = _ value
value = ::int #("," _ ::int)* { return new List(); }
number = ::$[0-9]+ _
_ = [ \t]*

JavaScript μ˜ˆμ œμ—μ„œ κ΅¬ν˜„λœ 클래슀의 예(μ‹€μ œ κ΅¬ν˜„μ΄ μ•„λ‹˜):

ClassMethod
  = head:FunctionHead __ params:FunctionParameters __ body:FunctionBody {
      return {
        type: "method",
        name: head[ 1 ],
        modifiers: head[ 0 ],
        params: params,
        body: body
      };
    }

// `::` inside the zero_or_more "( ... )*" builds an array as we want,
// so this rule returns `[FunctionModifier[], Identifier]` as expected
MethodHead = (::MethodModifier __)* ("function" __)? ::Identifier

// https://github.com/tc39/proposal-class-fields#private-fields
MethodModifier
  = "#"
  / "static"
  / "async"

FunctionParameters
  = "(" __ head:FunctionParam tail:(__ "," __ ::FunctionParam)* __ ")" {
      // due to `::`, tail is `FunctionParam[]` instead of `[__, "", __, FunctionParam][]`
      return [ head ].concat( tail );
    }
    / "(" __ ")" { return []; }

FunctionParam
  = name:Identifier value:(__ "=" __ ::Expression)? {
      return { name, value };
    }

FunctionBody = "{" __ ::SourceElements? __ "}"

μ™œ 이것듀이 λΆ„λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ? μ‹œν€€μŠ€μ˜ :: μ‹œν€€μŠ€μ˜ 인수 κ²°κ³Όλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?"

같은거 μ•„λ‹Œκ°€μš”? MethodHead , FunctionParam 및 FunctionBody 와 같은 λ‹€μ–‘ν•œ μ‚¬μš© μ‚¬λ‘€μ˜ κ²°κ³Όλ₯Ό μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ 더 λͺ…ν™•ν•˜κ²Œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

μ—¬λŸ¬ μœ ν˜•μ˜ 값을 λ°°μ—΄λ‘œ κ²°ν•©ν•˜λŠ” 것은 μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. (νŠœν”Œμ΄μ§€λ§Œ JSμ—μ„œλŠ” 거의 μ“Έλͺ¨κ°€ μ—†μŠ΅λ‹ˆλ‹€.)

λ‚΄ μ˜κ²¬μœΌλ‘œλŠ” AST(μƒμ„±λœ νŒŒμ„œμ˜ κ°€μž₯ 일반적인 κ²°κ³Ό)λ₯Ό μž‘μ„±ν•  λ•Œ λ‹€μŒκ³Ό 같이 μž‘μ„±ν•˜λŠ” λŒ€μ‹  MethodHead 와 같은 μ‚¬μš© 사둀λ₯Ό λ‹¨μˆœν™”ν•©λ‹ˆλ‹€.

MethodHead
  = modifiers:(::MethodModifier __)* ("function" __)? name:Identifier {
      return [ modifiers, name ];
    }

μ’€ 더 생각해 λ³Έ κ²°κ³Ό, 유슀 μΌ€μ΄μŠ€λ₯Ό λ‹¨μˆœν™”ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ κ°œλ°œμžκ°€ μ‹€μˆ˜λ₯Ό ν•  κ°€λŠ₯μ„±(문법을 κ΅¬ν˜„ν•˜λŠ” λ°©μ‹μ΄λ‚˜ κ²°κ³Όκ°€ μ•‘μ…˜μœΌλ‘œ μ²˜λ¦¬λ˜λŠ” 방식)도 μ—΄λ¦¬λ―€λ‘œ λ‹€μŒκ³Ό 같이 μƒκ°ν•©λ‹ˆλ‹€. multipleSingleReturns (κΈ°λ³Έκ°’: false )와 같은 μ˜΅μ…˜ 뒀에 μžˆλŠ” μ‚¬μš© 사둀가 μ—¬κΈ°μ—μ„œ κ°€μž₯ 쒋은 μ‘°μΉ˜κ°€ 될 κ²ƒμž…λ‹ˆλ‹€(이 κΈ°λŠ₯이 κ΅¬ν˜„λœ 경우).

#이 μ‹œν€€μŠ€μ— μ‚¬μš©λ˜λ©΄ κ²°κ³ΌλŠ” Array#κ°€ λΆ€λͺ¨μ˜ 배열에 μ—°κ²°λ©λ‹ˆλ‹€.

이제 그것은 λ”μ°ν•œ μƒκ°μž…λ‹ˆλ‹€. 이것은 λΆ„λͺ…νžˆ λΆˆν•„μš”ν•œ { return xs.push(x), xs }

λ˜ν•œ FunctionParameters 와 같은 보닀 일반적인 μ‚¬μš© μ‚¬λ‘€μ—μ„œ λ‹€μŒκ³Ό 같이 μž‘μ„±ν•˜λŠ” 것이 더 μ’‹μŠ΅λ‹ˆλ‹€.

// should always return `FunctionParam[]`
FunctionParameters
  = "(" __ ::FunctionParam #(__ "," __ ::FunctionParam)* __ ")"
  / "(" __ ")" { return []; }

λ§€κ°œλ³€μˆ˜ν™”λœ κ·œμΉ™μ„ μ‚¬μš©ν•˜μ—¬ 일반적인 λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜μ€‘μ— 계속 μ§„ν–‰ν•˜λŠ” 방법을 아직 잘 λͺ¨λ₯΄κΈ° λ•Œλ¬Έμ— λ§€κ°œλ³€μˆ˜ν™”λœ κ·œμΉ™ 전에 단일 λ°˜ν™˜ 값을 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€(ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜λŠ” 것을 μ’‹μ•„ν•˜μ§€λ§Œ rule < .., .. > = .. λ₯Ό μ‚¬μš©ν•˜λ©΄ PEG.js λ¬Έλ²•μ΄λ―€λ‘œ μ’€ 더 잘 λ§žλ„λ‘ μ•½κ°„μ˜ ꡬ문 변경을 μƒκ°ν•˜λ €κ³  ν•©λ‹ˆλ‹€.) ν•˜μ§€λ§Œ 그건 λ³„κ°œμ˜ λ¬Έμ œμž…λ‹ˆλ‹€.

μ—°μ‚°μžμ— μ‚¬μš©ν•  단일 문자 μ‹œν€€μŠ€λŠ” λ§Žμ§€ μ•ŠμœΌλ©° λ‚­λΉ„ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.

λ§žλŠ” λ§μ΄μ§€λ§Œ ν˜„μž¬μ˜ 상황 μžμ²΄κ°€ 이와 같을 λ•Œ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ 그것도 λ‚˜μ©λ‹ˆλ‹€.

μ „μ²˜λ¦¬ μ§€μ‹œλ¬Έμ„ κ΅¬ν˜„ν•˜λŠ” 일뢀 μ–Έμ–΄μ—μ„œ ν™•μž₯ μ—°μ‚°μžλ‘œ μ‚¬μš©λœλ‹€λŠ” 것을 κΈ°μ–΅ν•œ ν›„ 이 μ‚¬μš© 사둀에 # λ₯Ό μ‚¬μš©ν•˜λ €κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. 이것이 본질적으둜 이 μ‚¬μš© 사둀가 μ—¬κΈ°μ—μ„œ λ‹€λ£¨λŠ” λ‚΄μš©μž…λ‹ˆλ‹€.

λ”°λΌμ„œ f = ::"a" { return "b" } λŠ” 결과적으둜 ["a", "b"] λ₯Ό κ°€μ Έμ•Ό ν•©λ‹ˆκΉŒ?

μ½”λ“œ 블둝이 포함 된 객체와 같은 배열을 λ°˜ν™˜ νŒŒμ„œ κ³Όμ—° μ•„λ‹ˆ push 방법 (κ°€ 될 수 μžˆλ„λ‘ f = ::"a" { return [ "b" ] } 볡귀 [ "b", "a" ] κ²°κ³Ό) λ”°λΌμ„œ μ–΄λ ˆμ΄λΏλ§Œ μ•„λ‹ˆλΌ μœ μ‚¬ν•œ λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ κ΅¬ν˜„λœ λ™μΌν•œ 방법이 μžˆλŠ” μ‚¬μš©μž μ •μ˜ λ…Έλ“œμ— ν‘Έμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그것을 읽은 ν›„ 이것이 μ–΄λ–»κ²Œ μƒκ°μ˜ 첫 번째 κΈ°μ°¨μ˜€λŠ”κ°€λ₯Ό λ³΄μ•˜μ„ λ•Œ 이것이 pushSingleReturns 와 같은 μ˜΅μ…˜ 뒀에 μžˆλŠ”μ§€ μ΄ν•΄ν•˜λŠ” 것이 더 false (κΈ°λ³Έκ°’)인 경우 단일 λ°˜ν™˜ 값을 ν¬ν•¨ν•˜λŠ” μ‹œν€€μŠ€ 뒀에 μ½”λ“œ 블둝이 있으면 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

톡과 09 . 55: 7을 μœ„μ˜ μ˜ˆμ—μ„œ μƒμ„±λœ νŒŒμ„œμ— λŒ€μž…ν•˜λ©΄ λ‹€μŒμ΄ μƒμ„±λ©λ‹ˆλ‹€.

그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. . λ˜λŠ” : μ–ΈκΈ‰λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ£„μ†‘ν•©λ‹ˆλ‹€. 주어진 예제λ₯Ό λ‹€μ‹œ μž‘μ„±ν•  λ•Œ 남겨진 μ‹€μˆ˜μ˜€μŠ΅λ‹ˆλ‹€.

λ˜ν•œ _ λ₯Ό μ‚¬μš©ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. ν† ν°μ˜ 였λ₯Έμͺ½ λ˜λŠ” μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©° 문법을 μœ„ν•΄ ν•œ 번 μ„ νƒλœ μͺ½μž…λ‹ˆλ‹€. 였λ₯Έμͺ½μ— μžˆλŠ” 경우 κΈ°λ³Έ κ·œμΉ™λ„ _ μ‹œμž‘ν•΄μ•Ό ν•˜λ©° κ·Έ λ°˜λŒ€μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 단지 μ„ ν˜Έλ„μ˜ 문제라고 μƒκ°ν•©λ‹ˆλ‹€ :smile:, 비둝 이 예λ₯Ό μ΄ν•΄ν•˜λŠ” 것이 더 쉬웠을 것이라고 μƒκ°ν•˜μ§€λ§Œ:

number = _ ::value+ EOS
...
EOS = !.

μ„€λͺ…λœ λ™μž‘μ΄ κ²°κ³Όλ₯Ό μƒμ„±ν•˜λŠ” 방식도 μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

이 μ—…λ°μ΄νŠΈλœ λŒ“κΈ€μ΄ λ‚΄κ°€ λ§ν•˜λ €λŠ” λ‚΄μš©μ„ μ΄ν•΄ν•˜λŠ” 데 도움이 λ©λ‹ˆκΉŒ? 그렇지 μ•Šμ€ 경우 μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λŠ” 뢀뢄이 무엇인지 μ΄ν•΄ν•˜μ‹­μ‹œμ˜€.

μž₯μ†Œλ³„λ‘œ μ œκ³΅λ˜λŠ” λ³€κ²½ 사항이 κ·Ήλ„λ‘œ λͺ…ν™•ν•˜μ§€ μ•Šκ³  μΆ”κ°€ 였λ₯˜μ˜ 원인일 λΏμ΄λΌλŠ” @polkovnikov-ph에 λ™μ˜ν•©λ‹ˆλ‹€.

#이 μ‹œν€€μŠ€μ— μ‚¬μš©λ˜λ©΄ κ²°κ³ΌλŠ” Array#κ°€ λΆ€λͺ¨μ˜ 배열에 μ—°κ²°λ©λ‹ˆλ‹€.

start = #('a') λ¬Έλ²•μ—μ„œ 무엇을 λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆκΉŒ? λ‚΄κ°€ μ΄ν•΄ν•˜λŠ” ν•œ, κ·ΈλŠ” 배열을 λ³‘ν•©ν•˜κΈ° μœ„ν•œ ꡬ문 섀탕이 μ–΄λ–»κ²Œ λ˜λŠ”μ§€ μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. 이 μ—°μ‚°μžκ°€ ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ°€μž₯ λΆ„λͺ…ν•œ μš©λ„(ꡬ뢄 κΈ°ν˜Έκ°€ μžˆλŠ” 멀버 λͺ©λ‘ ν‘œν˜„)λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 특수 ꡬ문을 λ§Œλ“œλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€(#30 및 λ‚΄ 포크, https://github.com/Mingun/pegjs/commit/db4b2b102982a53dbed1f579477c85c06f8b92e6 μ°Έμ‘°).

κ·œμΉ™μ— ::/#와 ν•¨κ»˜ μ½”λ“œ 블둝이 μžˆλŠ” 경우 λ¨Όμ € μ‹€ν–‰ν•œ λ‹€μŒ κ²°κ³Ό ν‘Έμ‹œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

맀우 λΆˆλΆ„λͺ…ν•œ ν–‰λ™μž…λ‹ˆλ‹€. 문법 μ†ŒμŠ€μ˜ μž‘μ—…μ€ ν‘œν˜„μ‹ 뒀에 μœ„μΉ˜ν•˜λ©° 일반적으둜 ν‘œν˜„μ‹ ꡬ문 뢄석 후에 ν˜ΈμΆœλ©λ‹ˆλ‹€. 그리고 κ°‘μžκΈ° μ–΄λ–»κ²Œ λ“  ꡬ문 뢄석 전에 호좜되기 μ‹œμž‘ν•©λ‹ˆλ‹€. λ ˆμ΄λΈ”μ€ μ–΄λ–»κ²Œ μž‘λ™ν•©λ‹ˆκΉŒ?

λ‚˜λ¨Έμ§€ 3점은 당신이 κ·ΈλŸ­μ €λŸ­ μ„€λͺ…ν•˜μ—¬ κ·Έλ“€μ˜ λͺ…ν™•ν•œ 감각이 νƒˆμΆœν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. μ„€λͺ…에 첫 λ²ˆμ§Έμ™€ 두 번째 경우λ₯Ό κ΅¬λΆ„ν•˜λŠ” μ΄μœ κ°€ @polkovnikov-ph에 μ–Όλ§ˆλ‚˜ μ •ν™•ν•˜κ²Œ κΈ°λ‘λ˜μ—ˆμŠ΅λ‹ˆκΉŒ? 두 가지 κ°„λ‹¨ν•œ κ·œμΉ™λ§Œ μ‹€ν–‰λ©λ‹ˆλ‹€.

  1. :: (μ†”μ§νžˆ λ§ν•΄μ„œ, λ‚˜λŠ” 이 μΊλ¦­ν„°μ˜ 선택이 λ§ˆμŒμ— 듀지 μ•ŠμŠ΅λ‹ˆλ‹€. λ„ˆλ¬΄ μ‹œλ„λŸ½μŠ΅λ‹ˆλ‹€) ν‘œν˜„μ‹μ΄ 이 문자둜 ν‘œμ‹œλœ sequence λ…Έλ“œ μš”μ†Œμ—μ„œ 이 λ¬Έμžκ°€ λ°˜ν™˜λœλ‹€λŠ” μ‚¬μ‹€λ‘œ 이어지기 전에
  2. μ‹œν€€μŠ€μ—μ„œ μ΄λŸ¬ν•œ μš”μ†Œκ°€ ν•˜λ‚˜λ§Œ 있으면 κ²°κ³Όκ°€ λ°˜ν™˜λ˜κ³ , 그렇지 μ•ŠμœΌλ©΄ κ²°κ³Ό 배열이 λ°˜ν™˜λ©λ‹ˆλ‹€.

예:

start =   'a' 'b'   'c'; // => ['a', 'b', 'c']
start = ::'a' 'b'   'c'; // => 'a'
start = ::'a' 'b' ::'c'; // => ['a', 'c']

큰 μ˜ˆλŠ” λ‚΄κ°€ :: μ—μ„œ λ³Ό κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜λŠ” 것을 μ •ν™•νžˆ μ„€λͺ…ν•˜κ³  λͺ¨ν˜Έν•œ μ‚¬μš© 사둀( # , μ—¬λŸ¬ :: )λ₯Ό μ„€λͺ…ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

같은거 μ•„λ‹Œκ°€μš”?

그게 λ‚΄κ°€ λ¬Όμ–΄λ³Έκ±°μ•Ό. 일반적인 λ°©μ‹μ˜ μ„€λͺ…은 일반적으둜 더 μœ μš©ν•©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ λ…μžκ°€ 그것이 μ‹€μ œλ‘œ 같은 κ²ƒμž„μ„ ν™•μ‹ ν•˜κ²Œ ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ„€λͺ…ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. :)

제 μƒκ°μ—λŠ” MethodHead와 같은 μ‚¬μš© 사둀λ₯Ό λ‹¨μˆœν™”ν•  κ²ƒμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λŒ€μ‹  객체λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? ν‘œκΈ°λ²•μ— modifiers: 및 name: κ°€ μžˆμŠ΅λ‹ˆλ‹€. κ²°κ³Ό JS 객체에 κ·ΈλŒ€λ‘œ λ‘μ‹­μ‹œμ˜€. 그러면 λ©‹μ§ˆ κ²ƒμž…λ‹ˆλ‹€.

그것은 λ˜ν•œ κ°œλ°œμžκ°€ μ‹€μˆ˜λ₯Ό ν•  κ°€λŠ₯성을 μ—΄μ–΄μ€λ‹ˆλ‹€(그듀이 문법을 κ΅¬ν˜„ν•˜λŠ” λ°©μ‹μ΄λ‚˜ μ‘°μΉ˜μ— μ˜ν•΄ κ²°κ³Όκ°€ μ²˜λ¦¬λ˜λŠ” 방식)

μ²˜μŒμ—λŠ” 이것에 λŒ€ν•΄ 글을 μ“Έ μ˜ˆμ •μ΄μ—ˆμ§€λ§Œ, λ‚˜μ€‘μ—λŠ” μ–΄λ €μš΄ λ…Όκ±°κ°€ μΆ©λΆ„ν•˜μ§€ μ•Šλ‹€κ³  κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. λ™μΌν•œ μˆ˜μ€€μ˜ μ‹œν€€μŠ€μ—μ„œ μ—¬λŸ¬ :: λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€(ν”Œλž˜κ·Έκ°€ μžˆλŠ” κ²½μš°μ—λ„ μ œμ™Έ).

λ˜ν•œ λ‹€μŒκ³Ό 같이 μž‘μ„±ν•˜λŠ” 것이 더 쒋은 FunctionParameters와 같은 보닀 일반적인 μ‚¬μš© 사둀에 도움이 λ©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 그것은 같은 κ²ƒμž…λ‹ˆλ‹€. 정말 쒋은 ꡬ문은 inter(FunctionParam, "," __) μž…λ‹ˆλ‹€.

inter a b = x:a xs:(b ::a)* { return xs.unshift(x), xs; }

rule < .., .. > = .. PEG.js 문법에 λ§Žμ€ λ…Έμ΄μ¦ˆλ₯Ό μΆ”κ°€ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€

μ‚¬λžŒλ“€μ€ <...> κ°€ μœ ν˜•μ— μ‚¬μš©λ˜κΈ°λ₯Ό κΈ°λŒ€ν•˜μ§€λ§Œ 이 경우 μΈμˆ˜λŠ” μœ ν˜•μ΄ μ•„λ‹™λ‹ˆλ‹€. κ°€μž₯ 쒋은 방법은 μΆ”κ°€ λ¬Έμžκ°€ μ „ν˜€ μ—†λŠ” Haskell λ°©λ²•μž…λ‹ˆλ‹€(μœ„μ˜ inter μ°Έμ‘°). ; μƒλž΅λœ PEG.js λ¬Έλ²•μ—μ„œ 이것이 μ–΄λ–»κ²Œ μƒν˜Έ μž‘μš©ν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. f a b = ... κ°€ 이전 행에 (λΆ€λΆ„μ μœΌλ‘œ) ν¬ν•¨λ˜λŠ” κ²½μš°κ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ „μ²˜λ¦¬ μ§€μ‹œλ¬Έμ„ κ΅¬ν˜„ν•˜λŠ” 일뢀 μ–Έμ–΄μ—μ„œ ν™•μž₯ μ—°μ‚°μžλ‘œ μ‚¬μš©

예, ν•˜μ§€λ§Œ μŠ€λ§ˆνŠΈν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 배열에 λŒ€ν•΄ μ œμ•ˆλœ push μž‘μ—… λŒ€μ‹  κ°œμ²΄μ— λŒ€ν•œ Object.assign μž‘μ—… λ˜λŠ” 빈 λ¬Έμžμ—΄( eps )κ³Ό μΌμΉ˜ν•˜μ§€λ§Œ λ°˜ν™˜ν•˜λŠ” μž‘μ—…μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. κ·Έ μ£Όμž₯. 예λ₯Ό λ“€μ–΄,

f = type:#"ident" name:$([a-z]i [a-z0-9_]i+)

"abc" μž…λ ₯에 λŒ€ν•΄ {type: "ident", name: "abc"} λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ•„λ‹ˆμ˜€, μ½”λ“œ 블둝은 νŒŒμ„œκ°€ ν‘Έμ‹œ λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” λ°°μ—΄κ³Ό μœ μ‚¬ν•œ 객체λ₯Ό λ°˜ν™˜ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜κΈ° λ•Œλ¬Έμ—(λ”°λΌμ„œ f = ::"a" { return [ "b" ] } λ°˜ν™˜ [ "b", " a" ] κ²°κ³Ό),

였_였

이건 정말 μ·¨ν–₯의 문제인 것 κ°™μ•„μš”

뿐만 μ•„λ‹ˆλΌ μ„±λŠ₯도 κ·Έλ ‡μŠ΅λ‹ˆλ‹€. λͺ¨λ“  ν† ν°μ˜ μ–‘μͺ½μ— _ μžˆλŠ” 경우 곡백 문자 μ‹œν€€μŠ€λŠ” ν›„ν–‰μ—λ§Œ μΌμΉ˜ν•˜κ³  _ μ•žμ—λŠ” 아무것도 μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. parse$_ λŒ€ν•œ μΆ”κ°€ ν˜ΈμΆœμ€ μ‹œκ°„μ΄ 쑰금 더 κ±Έλ¦½λ‹ˆλ‹€. λ˜ν•œ _ κ°€ 두 λ°° 더 많기 λ•Œλ¬Έμ— μ½”λ“œκ°€ 더 κΉλ‹ˆλ‹€.

@Mingun @futagoza λŠ” λ””μžμΈ 곡간을 νƒκ΅¬ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 그것은 쒋은 μΌμž…λ‹ˆλ‹€. 특히 그것이 κ³΅κ°œλ˜μ–΄ 있고 μš°λ¦¬κ°€ λ™μ˜ν•˜μ§€ μ•Šμ„ κΈ°νšŒκ°€ μžˆλŠ” κ²½μš°μ— κ·Έλ ‡μŠ΅λ‹ˆλ‹€. :)

κ°€μž₯ μ€‘μš”ν•œ 것은 "μ™œ"라고 λ¬»λŠ” 것이 μ•„λ‹ˆλΌ "μ•„λ‹ˆμ˜€! 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€!"라고 λ§ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

image

f = type:#"ident" name:$([a-z]i [a-z0-9_]i+) λŠ” "abc" μž…λ ₯에 λŒ€ν•΄ {type: "ident", name: "abc"} λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ•„λ‹ˆ, ν•˜ν•˜. κ·Έ ꡬ문은 _wayyy_ λ„ˆλ¬΄ λ§ˆμˆ μ μž…λ‹ˆλ‹€.

μ›λž˜ μ œμ•ˆλœ @ μ—°μ‚°μžλŠ” μžˆλŠ” κ·ΈλŒ€λ‘œ μ™„λ²½ ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ„ˆλ¬΄ λ§Žμ€ μ‹œκ°„ λ‚˜λŠ” μ‹œν€€μŠ€ λ¬Έμ œμ— λΆ€λ”ͺμΉ©λ‹ˆλ‹€.

sequence
    = first:element rest:(whitespace next:element {return next;})*
    {
        return [first].concat(rest);
    }
    ;

_그런_ _ λ°˜λ³΅ν•΄μ„œ μž…λ ₯ν•˜λŠ” 것은 κ³ ν†΅μŠ€λŸ½μŠ΅λ‹ˆλ‹€. 특히 그보닀 더 λ³΅μž‘ν•œ κ²½μš°μ—λŠ” λ”μš± κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ @ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ μœ„μ˜ λ‚΄μš©μ€ λ‹€μŒκ³Ό 같이 κ°„λ‹¨ν•΄μ§‘λ‹ˆλ‹€.

sequence = first:element rest:(whitespace @element)* { return [first].concat(rest); };

https://github.com/pegjs/pegjs/issues/235#issuecomment -66915879 λ˜λŠ” https://github.com/pegjs/pegjs/issues/235#issuecomment -67544080을 μ‚¬μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μΆ”κ°€λ‘œ μΆ•μ†Œλ©λ‹ˆλ‹€.

sequence = first:element rest:(whitespace @element)* => [first].concat(rest);
/* or */
sequence = first:element rest:(whitespace @element)* {=[first].concat(rest)};

... 첫 λ²ˆμ§ΈλŠ” λ‚΄κ°€ 맀우 λΆ€λΆ„μ μž…λ‹ˆλ‹€.

이것은 λ‹¬μ„±ν•˜κΈ° μ‰¬μš΄ 이전 버전과 ν˜Έν™˜λ˜λŠ” 변경인 κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€(λˆ„κ΅°κ°€κ°€ 이미 μˆ˜ν–‰ν•œ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€).

사싀 제 착각이 μ•„λ‹ˆλΌλ©΄ μ‚¬μ†Œν•œ 좩돌일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 0.11.0 @futagoza에 λŒ€ν•΄ 생각할 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

방금 λ§ˆμŠ€ν„°μ— μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. :: λ₯Ό 닀쀑 뽑기에 μ‚¬μš©ν•˜κ³  @ λ₯Ό 단일 뽑기에 μ‚¬μš©ν•  κ³„νšμ΄μ—ˆμ§€λ§Œ λ ˆμ΄λΈ”κ³Ό ν•¨κ»˜ :: μ‚¬μš©ν•˜λŠ” 것이 보기에 λ„ˆλ¬΄ μΆ”ν•˜κ³  ν˜Όλž€μŠ€λŸ¬μ›Œμ„œ κ·Έ 아이디어λ₯Ό μ€‘λ‹¨ν–ˆμŠ΅λ‹ˆλ‹€ πŸ™„

λ‚˜λŠ” 이것을 μž μ‹œ λ™μ•ˆ 슀슀둜 κ΅¬ν˜„ν•˜κΈ° μ‹œμž‘ν–ˆμ§€λ§Œ μ§€κΈˆκΉŒμ§€ (λŒ€μ‹  #579λ₯Όν•΄μ•Ό ν•  λ•Œ πŸ˜†) λ°”μ΄νŠΈ μ½”λ“œ 생성기λ₯Ό Mingun의 κ΅¬ν˜„μ— κΈ°λ°˜ν–ˆμŠ΅λ‹ˆλ‹€ (https://github.com/Mingun/pegjs/commit/1c1c852bae91868eaa90d9bd9f7e4f722ea6435 )

https://pegjs.org/development/try (온라인 νŽΈμ§‘κΈ°μ΄μ§€λ§Œ PEG 0.11.0-dev μ‚¬μš©)μ—μ„œ μ‹œλ„ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μ„±μŠ€λŸ¬μš΄ μ „ν™˜ μ‹œκ°„, 배트맨. 멋진 μž‘μ—… @futagoza , 이것은 μ™„λ²½ν•˜κ²Œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. λŒ€λ‹¨νžˆ κ°μ‚¬ν•©λ‹ˆλ‹€. 이것은 이미 npm의 dev νƒœκ·Έλ‘œ μΆœμ‹œλ˜μ—ˆμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” κ·Έκ²ƒμœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό μ‹œμž‘ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ λ¬Έλ²•μœΌλ‘œ μ‹œλ„ν•˜κ³  싢은 μ‚¬λžŒμ„ μœ„ν•΄ 이 강아지λ₯Ό 거기에 λ„£κ³  "abcd" 와 같은 μž…λ ₯을 μ œκ³΅ν•˜μ‹­μ‹œμ˜€.

foo
    = '"' @$bar '"'
    ;

bar
    = [abcd]*
    ;

이것은 이미 npm의 dev νƒœκ·Έμ— λ¦΄λ¦¬μŠ€λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?

https://www.npmjs.com/package/pegjs/v/0.11.0-dev.325

μ•ˆλ…•ν•˜μ„Έμš”, 이것은 es6이 있으면 μ‚¬λΌμ§€λŠ” 문제 쀑 ν•˜λ‚˜μ΄λ©°, κ·Έ μ΄ν›„λ‘œ es6에 μΆ”κ°€λœ λ‹€λ₯Έ κΈ°λŠ₯을 μœ„ν•΄ ν•΄λ‹Ή λ¬Έμžκ°€ ν•„μš”ν•©λ‹ˆλ‹€. 이미 ν•  수 μžˆλŠ” 일에 μ—°μ‚°μžλ₯Ό μΆ”κ°€ν•˜λŠ” 것은 맀우 λΉ„μƒμ‚°μ μž…λ‹ˆλ‹€.

이 티켓이 λ³‘ν•©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

pattern:Pattern init:(_ "=" _ <strong i="7">@a</strong>:AssignmentExpression)?

λͺ¨λ“  μ‚¬λžŒμ΄ 본질적으둜 μ΄ν•΄ν•˜κ³  νŒŒμ„œμ˜ λ‹€λ₯Έ 뢀뢄이 μ™„λ£Œλ˜λ©΄ 무료둜 μ œκ³΅λ˜λŠ” es6의 λ™μΌν•œ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

pattern:Pattern init:(_ "=" _ a:AssignmentExpression)? => a

λ¬Έμ œλŠ” ν…ŒμŠ€νŠΈν–ˆμ„ λ•Œ 이 pluck κ΅¬ν˜„μ΄ 버그가 μžˆλŠ” 것 κ°™μœΌλ©° λ¬Όλ‘  λ¦΄λ¦¬μŠ€λ˜μ§€ μ•Šμ„ λΆ„κΈ°μ—μ„œ μˆ˜μ •λ˜μ—ˆκΈ° λ•Œλ¬Έμ— λ‹«νžŒ κ²ƒμœΌλ‘œ ν‘œμ‹œλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 λ¬Έμ œκ°€ 릴리슀된 λ²„μ „μ—μ„œ μˆ˜μ •λ  λ•ŒκΉŒμ§€ @futagoza λ₯Ό λ‹€μ‹œ μ—¬μ‹­μ‹œμ˜€.

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