summaryrefslogtreecommitdiff
path: root/unit-tests/lexer/driver.cxx
blob: ef637cc75355f2fae1cbcff9d58ee707e378c246 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// file      : unit-tests/lexer/driver.cxx
// author    : Boris Kolpackov <boris@codesynthesis.com>
// copyright : Copyright (c) 2009-2018 Code Synthesis Tools CC
// license   : MIT; see accompanying LICENSE file

#include <fstream>
#include <iostream>

#include <cli/token.hxx>
#include <cli/lexer.hxx>

using namespace std;

const char* keywords[] =
{
  "source",
  "include",
  "namespace",
  "class",
  "signed",
  "unsigned",
  "bool",
  "char",
  "wchar_t",
  "short",
  "int",
  "long",
  "float",
  "double"
};

const char* punctuation[] = {
  ";", ",", ":", "::", "{", "}", /*"(", ")",*/ "=", "|"};

int
main (int argc, char* argv[])
{
  if (argc != 2)
  {
    cerr << "usage: " << argv[0] << " file.cli" << endl;
    return 1;
  }

  ifstream ifs;
  ifs.exceptions (ifstream::failbit | ifstream::badbit);
  ifs.open (argv[1]);

  lexer l (ifs, argv[1]);

  while (true)
  {
    token t (l.next ());

    switch (t.type ())
    {
    case token::t_eos:
      {
        cout << "<EOS>" << endl;
        return 0;
      }
    case token::t_keyword:
      {
        cout << "keyword: " << keywords[t.keyword ()] << endl;
        break;
      }
    case token::t_identifier:
      {
        cout << "identifier: " << t.identifier () << endl;
        break;
      }
    case token::t_punctuation:
      {
        cout << punctuation[t.punctuation ()] << endl;
        break;
      }
    case token::t_cxx_path_lit:
      {
        cout << "c++ path: " << t.literal () << endl;
        break;
      }
    case token::t_cli_path_lit:
      {
        cout << "cli path: " << t.literal () << endl;
        break;
      }
    case token::t_string_lit:
      {
        cout << t.literal () << endl;
        break;
      }
    case token::t_char_lit:
      {
        cout << t.literal () << endl;
        break;
      }
    case token::t_bool_lit:
      {
        cout << t.literal () << endl;
        break;
      }
    case token::t_int_lit:
      {
        cout << t.literal () << endl;
        break;
      }
    case token::t_float_lit:
      {
        cout << t.literal () << endl;
        break;
      }
    case token::t_call_expr:
      {
        cout << t.expression () << endl;
        break;
      }
    case token::t_template_expr:
      {
        cout << t.expression () << endl;
        break;
      }
    }
  }
}