Pegjs: ๋…ธ๋“œ ์œ„์น˜ ์ถ”์  ๊ธฐ๋Šฅ ์ถ”๊ฐ€

์— ๋งŒ๋“  2011๋…„ 08์›” 13์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pegjs/pegjs

PEG.js ์ƒ์„ฑ ํŒŒ์„œ๋Š” ํ˜„์žฌ ์œ„์น˜(์ค„ ๋ฐ ์—ด)๋ฅผ ์ถ”์ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๊ฝค ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์•„์„œ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์ผ์น˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ ๊ฐœ์ฒด์— line ๋ฐ column ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

start = "a" b:"b" { return [b.line, b.column]; } // Returns [1, 2] on the input "ab".

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ๊ทœ์น™์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•˜์—ฌ action/predicates ๋‚ด์—์„œ ํŠน๋ณ„ํ•œ line ๋ฐ column ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

start = "a" "b" { return [line, column]; } // Returns [1, 1] on the input "ab".

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๋” ์œ ์—ฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ด๋Ÿฌํ•œ ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ• ์ง€๋Š” ์•„์ง ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค. ์œ„์น˜ ์ถ”์ ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ truthy ๊ฐ’์ด ์žˆ๋Š” trackPosition ์˜ต์…˜์ด PEG.buildParser ์— ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ถ”์ ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@tomitreskak ์ด ๊ธฐ๋Šฅ์€ ๋ถ„๋ช…ํžˆ ๊ณผ๊ฑฐ์— ๋ช‡ ๋ฒˆ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. tl;dr์€ ๋ฌธ๋ฒ•์—์„œ location() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  15 ๋Œ“๊ธ€

๋‘ ์˜ต์…˜ ๋ชจ๋‘ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ํ•„์š”์— ๋”ฐ๋ผ ๋‹จ์ˆœํžˆ ์„ , ์—ด์ด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‚˜๋Š” computeErrorPosition()์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•ดํ‚นํ–ˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๊ผฌ์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‘ ๋ฒˆ์งธ ๋ฐฉ์‹๋ณด๋‹ค ๋” ์ง๊ด€์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐฉ์‹๋„ ๋” ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํšจ์œจ์„ฑ ์ค‘ ํ•˜๋‚˜๋Š” name.position์„ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋Š๋ฆฌ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ–‰๊ณผ ์—ด์˜ 2๊ฐœ ํ•ญ๋ชฉ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‹จ์ผ ํ•ญ๋ชฉ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

๋Œ์ด์ผœ ๋ณด๋ฉด ์‹œ์ž‘ ๋ฐ ๋ ๋ฌธ์ž ์œ„์น˜๋ฅผ ์ œ๊ณตํ•œ ๋‹ค์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์œ„์น˜๋ฅผ ํ–‰/์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ํ•œ ์ค„/์—ด์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋‹จ ์˜ค๋ฅ˜์— ๋„๋‹ฌํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•œ ๋ฒˆ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์žฌ startPos0 ๋ฐ pos ๋ณ€์ˆ˜๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ํ•ดํ‚น ๋ฐฉ์‹์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•ดํ‚น์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ ์ง€๊ธˆ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ์ˆ˜์ •์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด ํ•จ์ˆ˜( computeErrorPosition ์˜ ๋Œ€๋žต์ ์ธ ์‚ฌ๋ณธ)๋ฅผ ๋ฌธ๋ฒ• ๋งจ ์œ„์— ํฌํ•จํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ _current_ ์œ„์น˜๋ฅผ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐœ๋ณ„ ๋…ธ๋“œ์˜ ์œ„์น˜๋Š” ์•„๋‹ˆ์ง€๋งŒ):

  function computeCurrentPos() {
    /*
     * The first idea was to use |String.split| to break the input up to the
     * error position along newlines and derive the line and column from
     * there. However IE's |split| implementation is so broken that it was
     * enough to prevent it.
     */

    var line = 1;
    var column = 1;
    var seenCR = false;

    for (var i = 0; i < pos; i++) {
      var ch = input.charAt(i);
      if (ch === '\n') {
        if (!seenCR) { line++; }
        column = 1;
        seenCR = false;
      } else if (ch === '\r' | ch === '\u2028' || ch === '\u2029') {
        line++;
        column = 1;
        seenCR = true;
      } else {
        column++;
        seenCR = false;
      }
    }

    return { line: line, column: column, pos: pos };
  }

์ด ๋ฌธ์ œ๋Š” ์ผ๋ จ์˜ ์ปค๋ฐ‹ ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ trackLineAndColumn ์˜ต์…˜์„ PEG.buildParser ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var parser = PEG.buildParser(myGrammar, { trackLineAndColumn: true});

trackLineAndColumn ๋ฅผ true ๋กœ ์„ค์ •ํ•˜๋ฉด ๋‘ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๊ฐ€ ์•ก์…˜๊ณผ ์ˆ ์–ด์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค โ€” line ๋ฐ column . ์กฐ์น˜์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋Š” ์กฐ์น˜ ํ‘œํ˜„์‹์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ˜๋ฉด ์ˆ ์–ด์—์„œ๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘์€ ์˜ˆ์ƒ ์‚ฌ์šฉ์— ์˜ํ•ด ์œ ๋ฐœ๋ฉ๋‹ˆ๋‹ค.

ํ–‰ ๋ฐ ์—ด ์ถ”์ ์€ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค(ํŒŒ์„œ๊ฐ€ ์•ฝ โ€‹โ€‹3-4๋ฐฐ ๋Š๋ ค์ง). ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฏธ๋ž˜์— ์–ด๋Š ์ •๋„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋จผ์ € ์ž‘๋™์‹œํ‚ค๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค).

๋ฌธ์ œ ์„ค๋ช…์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. line ๋ฐ column ์†์„ฑ์„ ๊ฐ ์ผ์น˜ ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๊นจ๋—ํ•˜๊ณ  ์„ ํ˜ธ๋˜์—ˆ์ง€๋งŒ ๋ฌธ์ž์—ด, ์ˆซ์ž ๋˜๋Š” ๋ถ€์šธ(์ข…์ข… ์ผ์น˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋จ)๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ๊ฐ’์— ๋Œ€ํ•œ ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋ž˜ํ•‘ ๊ฐœ์ฒด(์˜ˆ: String , Number ๋˜๋Š” Boolean )์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ํŒŒ์„œ์— ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ž˜ํผ๋Š” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์™€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€์•ˆ ์ œ์•ˆ์„ ์‹คํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋„๋ก ์˜จ๋ผ์ธ ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๊นŒ?

@paulftw ์˜จ๋ผ์ธ ํŽธ์ง‘๊ธฐ๋Š” ํ•ญ์ƒ ์ตœ์‹  ์•ˆ์ • ๋ฒ„์ „์˜ PEG.js(ํ˜„์žฌ 0.6.2)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. PEG.js 0.7.0(์ด ๊ธฐ๋Šฅ์ด ํฌํ•จ๋จ)์„ ๋ฆด๋ฆฌ์Šคํ•˜๋ฉด ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํ•œ 4์›” ํ•˜๋ฐ˜๊ธฐ์— ์ผ์–ด๋‚  ๊ฒƒ์ด๋‹ค.

์›น ์‚ฌ์ดํŠธ ์†Œ์Šค ์ฝ”๋“œ๋Š” GitHub ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์กฐ๊ธ‰ํ•ดํ•˜๋ฉด ์ง์ ‘ ์‹คํ–‰ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ–‰๊ณผ ์—ด์€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ง€๋งŒ JS ๋ฐฐ์—ด๊ณผ ๊ฑฐ์˜ ๋ชจ๋“  ์ตœ์‹  ์–ธ์–ด ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” 0 ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ ๋””์ž์ธ ๊ฒฐ์ •์„ ๋˜๋Œ๋ฆด ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@paulftw ํ–‰๊ณผ ์—ด์„ 0 ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณด๊ณ ํ•˜๋Š” ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด ๊ฒฐ์ • ๋’ค์— ์žˆ๋Š” ์•„์ด๋””์–ด๋Š” ์ด๋Ÿฌํ•œ ์ˆซ์ž๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’๊ธฐ ๋•Œ๋ฌธ์—(์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€, ๋…ธ๋“œ ์œ„์น˜ ๋“ฑ) 1 ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ์ด 0 ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๊ณ„ ์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ offset ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฉฐ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋””์ž์ธ ๊ฒฐ์ •์„ ๋˜๋Œ๋ฆด ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค, ํ™•์‹ ์ด ๋“œ์‹ ๋‹ค๋ฉด :-)

์ €๋Š” Ace ํŽธ์ง‘๊ธฐ์—์„œ ํ…์ŠคํŠธ๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด peg.js๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—์ด์Šค ๋ผ์ธ ๋ฒˆํ˜ธ๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Bison์˜ ์œ„์น˜๋Š” 1 ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค.
http://git.savannah.gnu.org/cgit/bison.git/tree/src/location.c#n73

์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด ๋‚˜๋Š” ๋…ผ์Ÿ์„ ๊ทธ๋งŒ๋‘ฌ์•ผ ํ•œ๋‹ค.

์–ด๋–ค ์˜ˆ๋ฅผ ๋ณด๊ณ  ์‹ถ์€์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ์€ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐํ˜ธ ์ด๋ฆ„์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

ํฌํš์ž
= "" { return new Position(์ค„ - 1, ์—ด - 1); }

์ƒ์ง•
= ์‹œ์ž‘:์บกํ„ฐ ์ด๋ฆ„:IDENT ๋:์บกํ„ฐ S* { return new Symbol(name, new Range(start, end)); }

@paulftw ์ด ๋ฌธ์ œ๋ฅผ ๋ณ„๋„์˜ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ 0.7.0์„ ์ฑ„ํƒํ•˜๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๊ฒฐ์ •ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์˜ค๋žซ๋™์•ˆ ํ์‡„๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์ด๊ฒƒ์„ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์— ์•„์ฃผ ๋ฉ์ฒญํ•˜๋‹ค. "trackLineAndColumn': true" ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ๋ฒ•์„ ์ปดํŒŒ์ผํ–ˆ์ง€๋งŒ ๋…ธ๋“œ์—๋Š” ์—ฌ์ „ํžˆ ํ–‰๊ณผ ์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ ๋ฌด์—‡์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

๋‹น์‹ ์€ ๋‹ค์Œ์„ ์–ธ๊ธ‰, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋Š” ์–ด๋”˜๊ฐ€์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

trackLineAndColumn์„ true๋กœ ์„ค์ •ํ•˜๋ฉด ๋‘ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๊ฐ€ action๊ณผ predicate์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(line๊ณผ column). ์กฐ์น˜์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋Š” ์กฐ์น˜ ํ‘œํ˜„์‹์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ˜๋ฉด ์ˆ ์–ด์—์„œ๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘์€ ์˜ˆ์ƒ ์‚ฌ์šฉ์— ์˜ํ•ด ์œ ๋ฐœ๋ฉ๋‹ˆ๋‹ค.

@tomitreskak ์ด ๊ธฐ๋Šฅ์€ ๋ถ„๋ช…ํžˆ ๊ณผ๊ฑฐ์— ๋ช‡ ๋ฒˆ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. tl;dr์€ ๋ฌธ๋ฒ•์—์„œ location() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰