1 module ctpg.dsl.typed.token;
2 
3 import std.conv : to;
4 
5 enum TokenType
6 {
7     UNDEFINED,
8 
9     // 単一トークン
10     CONVERTER,
11     ID,
12     DOLLAR,
13     TEMPLATE_INSTANCE,
14     NONTERMINAL,
15     RANGE_ONE_CHAR,
16     RANGE_CHAR_RANGE,
17     RANGE,
18     STRING,
19 
20     // 再帰的なトークン
21     EXCLAM,
22     ANPERSAND,
23     ASCIICIRCUM,
24     ASTERISK,
25     PLUS,
26     QUESTION,
27     SEQUENCE,
28     LEFT_SHIFT,
29     LEFT_QUESTION,
30     SLASH,
31     DEFINITION,
32     DEFINITIONS,
33 
34     // 構文定義内で使える@トークン
35     SKIP,// SET_SKIPで指定されたスキップパーサでスキップする
36     SKIP_WITH, // これ自身が指定したスキップパーサでスキップする
37     SET_SKIP, // スキップパーサを設定する
38     MEMOIZE, // メモ化する
39 
40     SKIP_LITERAL_TRUE,
41     SKIP_LITERAL_FALSE,
42     MEMOIZE_SKIP_TRUE,
43     MEMOIZE_SKIP_FALSE,
44     MEMOIZE_LITERAL_TRUE,
45     MEMOIZE_LITERAL_FALSE,
46     MEMOIZE_NONTERMINAL_TRUE,
47     MEMOIZE_NONTERMINAL_FALSE,
48 
49     // 構文定義外で使える@トークン
50     GLOBAL_SET_SKIP,
51 
52     GLOBAL_SKIP_LITERAL_TRUE,
53     GLOBAL_SKIP_LITERAL_FALSE,
54     GLOBAL_MEMOIZE_SKIP_TRUE,
55     GLOBAL_MEMOIZE_SKIP_FALSE,
56     GLOBAL_MEMOIZE_LITERAL_TRUE,
57     GLOBAL_MEMOIZE_LITERAL_FALSE,
58     GLOBAL_MEMOIZE_NONTERMINAL_TRUE,
59     GLOBAL_MEMOIZE_NONTERMINAL_FALSE,
60 }
61 
62 struct Token
63 {
64     TokenType type;
65     string text_;
66 
67     string text() @property 
68     {
69         return text_.length == 0 ? type.to!string() : text_;
70     }
71 
72     void text(string text_) @property
73     {
74         this.text_ = text_;
75     }
76 }