Pegjs: рдиреЛрдб рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдЕрдЧре░ 2011  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pegjs/pegjs

PEG.js-рдЬрдирд░реЗрдЯреЗрдб рдкрд╛рд░реНрд╕рд░реНрд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд┐рддрд┐ (рд▓рд╛рдЗрди рдФрд░ рдХреЙрд▓рдо) рдХреЛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред

рдорд┐рд▓рд╛рди рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдИ рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдореЗрдВ line рдФрд░ column рдЧреБрдг рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ:

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

рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдирд┐рдпрдо рдХреА рд╢реБрд░реБрдЖрдд рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП, рдХреНрд░рд┐рдпрд╛рдУрдВ/рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рд╢реЗрд╖ line рдФрд░ column рдЪрд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдПрдВ:

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

рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд▓рдЪреАрд▓реЗрдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЕрднреА рддрдХ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛ред

рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╕реНрдерд┐рддрд┐ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдкрд╛рд░реНрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп trackPosition рд╕рддреНрдп рдорд╛рди рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ PEG.buildParser рдореЗрдВ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@tomitrescak рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрддреАрдд рдореЗрдВ рдХреБрдЫ рдмрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрджрд▓реА рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЪреИрдВрдЬ рдкрд░ рдПрдХ рдирдЬрд░ рдбрд╛рд▓реЗрдВред tl;dr рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ location() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рд╕рднреА 15 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреЛрдИ рднреА рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдореЗрд░реА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕ рд▓рд╛рдЗрди, рдХреЙрд▓рдо рдареАрдХ рд░рд╣реЗрдЧрд╛ред

рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рднреА рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВрдиреЗ рдХрдВрдкреНрдпреВрдЯ рдПрд░рд░рдкреЛрдЬрд┐рд╢рди () рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдЬрд▓реНрджреА рд╕реЗ рд╣реИрдХ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХрдИ рдХрд┐рдВрдХ рд╣реИрдВред

рд╕рддрд╣ рдкрд░, рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рджрдХреНрд╖рддрд╛ рдирд╛рдо рд╣реЛрдирд╛ рд╣реИред рд╕реНрдерд┐рддрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЖрд▓рд╕реА рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрд╣ рддрдм рд▓рд╛рдЗрди рдФрд░ рдХреЙрд▓рдо рдХреА 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 (рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА) рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░ рджреВрдВрдЧрд╛ред рдЬрдм рддрдХ рдХреБрдЫ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдирд╣реАрдВ рдЖрддрд╛, рдпрд╣ рдЕрдкреНрд░реИрд▓ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╣реЛрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реНрд░реЛрдд рдХреЛрдб GitHub рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ , рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЕрдзреАрд░ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд╕ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╕рднреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рд╕реНрддрдВрдн 1-рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдЬрдмрдХрд┐ JS рд╕рд░рдгрд┐рдпрд╛рдБ рдФрд░ рд╕рд╛рде рд╣реА рд╕рднреА рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдПрдБ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп 0-рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдХреНрд░рдордг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЙрд╕ рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛?

@paulftw рдХреНрдпрд╛ рдЖрдк рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓рд╛рдЗрдиреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреЛ 0-рдЖрдзрд╛рд░рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ?

рдореЗрд░реЗ рдирд┐рд░реНрдгрдп рдХреЗ рдкреАрдЫреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рдирдВрдмрд░реЛрдВ рдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ, рдиреЛрдб рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрджрд┐), рдЗрд╕рд▓рд┐рдП 1-рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдХреНрд░рдордг 0-рдЖрдзрд╛рд░рд┐рдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдорд╢реАрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, offset рдЪрд░ рдХрд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд┐ 0-рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдЙрд╕ рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛?

рд╣рд╛рдБ, рдЕрдЧрд░ рдореИрдВ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рдЬрд╛рдКрдВ :-)

рдореИрдВ рдРрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП peg.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдХрд╛рдлреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдРрд╕ рд▓рд╛рдЗрди рдирдВрдмрд░ 0-рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдЗрд╕рди рдореЗрдВ рд╕реНрдерд╛рди 1-рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред
http://git.savannah.gnu.org/cgit/bison.git/tree/src/location.c#n73

рдЕрдЧрд░ рд╡рд╛рдХрдИ рдРрд╕рд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрд╣рд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЕрднреА рдореИрдВ рдкреНрд░рддреАрдХ рдирд╛рдо рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

рдХрд╝реИрджреА рдмрдирд╛рдиреЗрд╡рд╛рд▓рд╛
= "" {рдирдИ рд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛рдПрдВ (рд▓рд╛рдЗрди -1, рдХреЙрд▓рдо -1); }

рдкреНрд░рддреАрдХ
= рдкреНрд░рд╛рд░рдВрдн: рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╛рдо: рдкрд╣рдЪрд╛рди рдЕрдВрдд: рдХреИрджреА рдПрд╕ * {рдирдпрд╛ рдкреНрд░рддреАрдХ рд▓реМрдЯрд╛рдПрдВ (рдирд╛рдо, рдирдИ рд╢реНрд░реЗрдгреА (рдкреНрд░рд╛рд░рдВрдн, рдЕрдВрдд)); }

@paulftw рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЬрд╛рд░реАрдХрд░реНрддрд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ 0.7.0 рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реВрдВрдЧрд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдкреНрд░рдЪрд▓рд┐рдд рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рддрдп рдХрд░рдирд╛ рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдмрдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдХрд╛рдо рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рдиреЛрдм рд╣реВрдБред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ "trackLineAndColumn': true" рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреЛрдбреНрд╕ рдореЗрдВ рдЕрднреА рднреА рд▓рд╛рдЗрдиреЗрдВ рдФрд░ рдХреЙрд▓рдо рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?

рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдХрд╣реАрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ?

TrackLineAndColumn рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╡рд┐рдзреЗрдп рдореЗрдВ рджреЛ рдирдП рдЪрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ - рд▓рд╛рдЗрди рдФрд░ рдХреЙрд▓рдоред рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпреЗ рдЪрд░ рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рд╡рд┐рдзреЗрдп рдореЗрдВ рд╡реЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИред

@tomitrescak рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрддреАрдд рдореЗрдВ рдХреБрдЫ рдмрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрджрд▓реА рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЪреИрдВрдЬ рдкрд░ рдПрдХ рдирдЬрд░ рдбрд╛рд▓реЗрдВред tl;dr рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ location() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

marek-baranowski picture marek-baranowski  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

brettz9 picture brettz9  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dmajda picture dmajda  ┬╖  20рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alanmimms picture alanmimms  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gatsbyz picture gatsbyz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ