// @flow import SourceLocation from "./SourceLocation"; /** * Interface required to break circular dependency between Token, Lexer, and * ParseError. */ export interface LexerInterface {input: string, tokenRegex: RegExp} /** * The resulting token returned from `lex`. * * It consists of the token text plus some position information. * The position information is essentially a range in an input string, * but instead of referencing the bare input string, we refer to the lexer. * That way it is possible to attach extra metadata to the input string, * like for example a file name or similar. * * The position information is optional, so it is OK to construct synthetic * tokens if appropriate. Not providing available position information may * lead to degraded error reporting, though. */ export class Token { text: string; loc: ?SourceLocation; constructor( text: string, // the text of this token loc: ?SourceLocation, ) { this.text = text; this.loc = loc; } /** * Given a pair of tokens (this and endToken), compute a `Token` encompassing * the whole input range enclosed by these two. */ range( endToken: Token, // last token of the range, inclusive text: string, // the text of the newly constructed token ) { return new Token(text, SourceLocation.range(this, endToken)); } }