From fe3d4ce758822d65a0a5d617b7b77df2dbc972d8 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Sun, 16 Mar 2014 14:55:57 -0700 Subject: Implement new magic frontend using sexpr --- src/sexpr/lexer.hpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/sexpr/lexer.hpp (limited to 'src/sexpr/lexer.hpp') diff --git a/src/sexpr/lexer.hpp b/src/sexpr/lexer.hpp new file mode 100644 index 0000000..7bce620 --- /dev/null +++ b/src/sexpr/lexer.hpp @@ -0,0 +1,73 @@ +#ifndef TMWA_SEXPR_LEXER_HPP +#define TMWA_SEXPR_LEXER_HPP +// lexer.hpp - tokenize a stream of S-expressions +// +// Copyright © 2014 Ben Longbons +// +// This file is part of The Mana World (Athena server) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +# include "../sanity.hpp" + +# include "../strings/astring.hpp" +# include "../strings/vstring.hpp" +# include "../strings/xstring.hpp" +# include "../strings/zstring.hpp" + +# include "../io/line.hpp" + +namespace sexpr +{ + enum Lexeme + { + TOK_EOF = 0, + TOK_ERROR, + TOK_OPEN, + TOK_CLOSE, + TOK_STRING, + TOK_TOKEN, + }; + + class Lexer + { + io::LineCharReader _in; + Lexeme _current; + AString _string; + io::LineSpan _span; + std::vector _depth; + private: + Lexeme _adv(); + public: + explicit + Lexer(ZString filename) + : _in(filename), _current(TOK_EOF), _span(), _depth() + { adv(); } + // for unit tests + Lexer(ZString fake, io::FD fd) + : _in(fake, fd), _current(TOK_EOF), _span(), _depth() + { adv(); } + Lexeme peek() { return _current; } + void adv() { _current = _adv(); } + ZString val_string() { return _string; } + io::LineSpan span() { return _span; } + }; + + VString<4> escape(char c); + AString escape(XString s); + + ZString token_name(Lexeme tok); +} // namespace sexpr + +#endif // TMWA_SEXPR_LEXER_HPP -- cgit v1.2.3-60-g2f50