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