@cucumber/gherkin
Version:
Gherkin parser
27 lines • 3.45 kB
JavaScript
/**
* The scanner reads a gherkin doc (typically read from a .feature file) and creates a token for each line.
* The tokens are passed to the parser, which outputs an AST (Abstract Syntax Tree).
*
* If the scanner sees a `#` language header, it will reconfigure itself dynamically to look for
* Gherkin keywords for the associated language. The keywords are defined in gherkin-languages.json.
*/
export default class TokenScanner {
makeToken;
lineNumber = 0;
lines;
constructor(source, makeToken) {
this.makeToken = makeToken;
this.lines = source.split(/\r?\n/);
if (this.lines.length > 0 && this.lines[this.lines.length - 1].trim() === '') {
this.lines.pop();
}
}
read() {
const line = this.lines[this.lineNumber++];
const location = {
line: this.lineNumber,
};
return this.makeToken(line, location);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9rZW5TY2FubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1Rva2VuU2Nhbm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLFlBQVk7SUFNWixTQUFTO0lBTHBCLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFDZCxLQUFLLENBQVU7SUFFdkIsWUFDRSxNQUFjLEVBQ0csU0FBa0U7eUJBQWxFLFNBQVM7UUFFMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2xDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVNLElBQUk7UUFDVCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sUUFBUSxHQUFHO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQ3RCLENBQUE7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9jYXRpb24gfSBmcm9tICdAY3VjdW1iZXIvbWVzc2FnZXMnXG5pbXBvcnQgdHlwZSBJVG9rZW4gZnJvbSAnLi9JVG9rZW4uanMnXG5cbi8qKlxuICogVGhlIHNjYW5uZXIgcmVhZHMgYSBnaGVya2luIGRvYyAodHlwaWNhbGx5IHJlYWQgZnJvbSBhIC5mZWF0dXJlIGZpbGUpIGFuZCBjcmVhdGVzIGEgdG9rZW4gZm9yIGVhY2ggbGluZS5cbiAqIFRoZSB0b2tlbnMgYXJlIHBhc3NlZCB0byB0aGUgcGFyc2VyLCB3aGljaCBvdXRwdXRzIGFuIEFTVCAoQWJzdHJhY3QgU3ludGF4IFRyZWUpLlxuICpcbiAqIElmIHRoZSBzY2FubmVyIHNlZXMgYSBgI2AgbGFuZ3VhZ2UgaGVhZGVyLCBpdCB3aWxsIHJlY29uZmlndXJlIGl0c2VsZiBkeW5hbWljYWxseSB0byBsb29rIGZvclxuICogR2hlcmtpbiBrZXl3b3JkcyBmb3IgdGhlIGFzc29jaWF0ZWQgbGFuZ3VhZ2UuIFRoZSBrZXl3b3JkcyBhcmUgZGVmaW5lZCBpbiBnaGVya2luLWxhbmd1YWdlcy5qc29uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2tlblNjYW5uZXI8VG9rZW5UeXBlPiB7XG4gIHByaXZhdGUgbGluZU51bWJlciA9IDBcbiAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1ha2VUb2tlbjogKGxpbmU6IHN0cmluZywgbG9jYXRpb246IExvY2F0aW9uKSA9PiBJVG9rZW48VG9rZW5UeXBlPlxuICApIHtcbiAgICB0aGlzLmxpbmVzID0gc291cmNlLnNwbGl0KC9cXHI/XFxuLylcbiAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPiAwICYmIHRoaXMubGluZXNbdGhpcy5saW5lcy5sZW5ndGggLSAxXS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmxpbmVzLnBvcCgpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlYWQoKTogSVRva2VuPFRva2VuVHlwZT4ge1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmxpbmVzW3RoaXMubGluZU51bWJlcisrXVxuICAgIGNvbnN0IGxvY2F0aW9uID0ge1xuICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYWtlVG9rZW4obGluZSwgbG9jYXRpb24pXG4gIH1cbn1cbiJdfQ==