aboutsummaryrefslogtreecommitdiff
path: root/build/lexer
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2014-12-11 13:57:42 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2014-12-11 13:57:42 +0200
commite6d92a1fb21232ab09886431d39ccb8a95c7c68d (patch)
tree0d543e1e3c1b22e88f22f02e2dae75ae9eba2db5 /build/lexer
parentfdc21950905d64b2ca1df5a0b2622022beffe922 (diff)
Initial lexer implementation for buildfiles
Diffstat (limited to 'build/lexer')
-rw-r--r--build/lexer98
1 files changed, 98 insertions, 0 deletions
diff --git a/build/lexer b/build/lexer
new file mode 100644
index 0000000..987efab
--- /dev/null
+++ b/build/lexer
@@ -0,0 +1,98 @@
+// file : build/lexer -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Tools CC
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BUILD_LEXER
+#define BUILD_LEXER
+
+#include <string>
+#include <iosfwd>
+#include <cstdint> // uint64_t
+#include <exception>
+
+#include <build/token>
+
+namespace build
+{
+ // The handler must assume the diagnostics has already been issued.
+ //
+ struct lexer_error: std::exception {};
+
+ class lexer
+ {
+ public:
+ lexer (std::istream& is, const std::string& name)
+ : is_ (is), name_ (name) {}
+
+ token
+ next ();
+
+ // Character interface.
+ //
+ private:
+ class xchar
+ {
+ public:
+ typedef std::char_traits<char> traits_type;
+ typedef traits_type::int_type int_type;
+ typedef traits_type::char_type char_type;
+
+ xchar (int_type v, std::uint64_t l, std::uint64_t c)
+ : v_ (v), l_ (l), c_ (c) {}
+
+ operator char_type () const {return static_cast<char_type> (v_);}
+
+ int_type
+ value () const {return v_;}
+
+ std::uint64_t line () const {return l_;}
+ std::uint64_t column () const {return c_;}
+
+ private:
+ int_type v_;
+ std::uint64_t l_;
+ std::uint64_t c_;
+ };
+
+ xchar
+ peek ();
+
+ xchar
+ get ();
+
+ void
+ unget (const xchar&);
+
+ // Tests.
+ //
+ bool
+ is_eos (const xchar& c) const
+ {
+ return c.value () == xchar::traits_type::eof ();
+ }
+
+ private:
+ xchar
+ escape ();
+
+ void
+ skip_spaces ();
+
+ token
+ name (xchar);
+
+ private:
+ std::istream& is_;
+ std::string name_;
+
+ std::uint64_t l_ {1};
+ std::uint64_t c_ {1};
+
+ bool eos_ {false};
+
+ bool unget_ {false};
+ xchar buf_ {0, 0, 0};
+ };
+}
+
+#endif // BUILD_LEXER