aboutsummaryrefslogtreecommitdiff
path: root/build2/test/script/lexer
blob: 99f87c0888fa365d4a454f7c289f67d88324fdfa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// file      : build2/test/script/lexer -*- C++ -*-
// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#ifndef BUILD2_TEST_SCRIPT_LEXER
#define BUILD2_TEST_SCRIPT_LEXER

#include <build2/types>
#include <build2/utility>

#include <build2/lexer>

#include <build2/test/script/token>

namespace build2
{
  namespace test
  {
    namespace script
    {
      struct lexer_mode: build2::lexer_mode
      {
        using base_type = build2::lexer_mode;

        enum
        {
          script_line = base_type::value_next,
          variable_line, // Auto-expires at the end of the line.
          test_line,
          command_line,
          here_line
        };

        using base_type::base_type;
      };

      class lexer: public build2::lexer
      {
      public:
        using base_lexer = build2::lexer;
        using base_mode = build2::lexer_mode;

        lexer (istream& is, const path& name, lexer_mode m)
            : base_lexer (is, name, nullptr, nullptr, false) {mode (m);}

        virtual void
        mode (base_mode, char = '\0') override;

        // Return true if we entered the quoted (double or single) mode since
        // last reset.
        //
        bool
        quoted () const {return quoted_;}

        void
        reset_quoted (bool q) {quoted_ = q;}

      protected:
        virtual token
        next_impl () override;

        token
        next_line ();

        token
        name_line (bool separated);

      protected:
        bool quoted_ = false;
      };
    }
  }
}

#endif // BUILD2_TEST_SCRIPT_LEXER