/* Compiler implementation of the D programming language * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved * written by Walter Bright * http://www.digitalmars.com * Distributed under the Boost Software License, Version 1.0. * http://www.boost.org/LICENSE_1_0.txt * https://github.com/D-Programming-Language/dmd/blob/master/src/lexer.h */ #pragma once #include "root/root.h" #include "globals.h" #include "tokens.h" struct StringTable; class Identifier; class Lexer { public: static OutBuffer stringbuffer; Loc scanloc; // for error messages const utf8_t *base; // pointer to start of buffer const utf8_t *end; // past end of buffer const utf8_t *p; // current character const utf8_t *line; // start of current line Token token; bool doDocComment; // collect doc comment information bool anyToken; // !=0 means seen at least one token bool commentToken; // !=0 means comments are TOKcomment's bool errors; // errors occurred during lexing or parsing Lexer(const char *filename, const utf8_t *base, size_t begoffset, size_t endoffset, bool doDocComment, bool commentToken); TOK nextToken(); TOK peekNext(); TOK peekNext2(); void scan(Token *t); Token *peek(Token *t); Token *peekPastParen(Token *t); unsigned escapeSequence(); TOK wysiwygStringConstant(Token *t, int tc); TOK hexStringConstant(Token *t); TOK delimitedStringConstant(Token *t); TOK tokenStringConstant(Token *t); TOK escapeStringConstant(Token *t); TOK charConstant(Token *t); void stringPostfix(Token *t); TOK number(Token *t); TOK inreal(Token *t); Loc loc() { scanloc.charnum = (unsigned)(1 + p-line); return scanloc; } void error(const char *format, ...); void error(Loc loc, const char *format, ...); void deprecation(const char *format, ...); void poundLine(); unsigned decodeUTF(); void getDocComment(Token *t, unsigned lineComment); static const utf8_t *combineComments(const utf8_t *c1, const utf8_t *c2); private: void endOfLine(); };