#pragma once #include #include #include #include #include "bolt/String.hpp" #include "bolt/Stream.hpp" #include "bolt/CST.hpp" namespace bolt { class Token; class Scanner : public BufferedStream { TextFile& File; Stream& Chars; TextLoc CurrLoc; inline TextLoc getCurrentLoc() const { return CurrLoc; } inline Char getChar() { auto Chr = Chars.get(); if (Chr == '\n') { CurrLoc.Line += 1; CurrLoc.Column = 1; } else { CurrLoc.Column += 1; } return Chr; } inline Char peekChar(std::size_t Offset = 0) { return Chars.peek(Offset); } protected: Token* read() override; public: Scanner(TextFile& File, Stream& Chars); }; enum class FrameType { Block, LineFold, }; class Punctuator : public BufferedStream { Stream& Tokens; std::stack Frames; std::stack Locations; protected: virtual Token* read() override; public: Punctuator(Stream& Tokens); }; }