Newer
Older
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
/*
* TreeFromStringLexer.cpp
*
* Created on: Nov 23, 2013
* Author: Jan Travnicek
*/
#include "TreeFromStringLexer.h"
namespace tree {
TreeFromStringLexer::Token TreeFromStringLexer::next ( std::istream & in ) const {
TreeFromStringLexer::Token token;
token.type = TokenType::ERROR;
token.value = "";
token.raw = "";
char character;
L0: character = in.get ( );
if ( in.eof ( ) ) {
token.type = TokenType::TEOF;
return token;
} else if ( ( character == ' ' ) || ( character == '\n' ) || ( character == '\t' ) ) {
token.raw += character;
goto L0;
} else if ( character == '#' ) {
token.value += character;
token.raw += character;
goto L1;
} else if ( character == '|' ) {
token.type = TokenType::BAR;
token.value += character;
token.raw += character;
return token;
} else if ( ( character >= '0' ) && ( character <= '9' ) ) {
token.type = TokenType::RANK;
token.value += character;
token.raw += character;
goto L2;
} else {
in.putback ( character );
putback ( in, std::move ( token ) );
in.clear ( );
token.type = TokenType::ERROR;
return token;
}
L1: character = in.get ( );
if ( in.eof ( ) ) {
token.type = TokenType::TEOF;
return token;
} else if ( character == 'S' ) {
token.type = TokenType::SUBTREE_WILDCARD;
token.value += character;
token.raw += character;
return token;
} else {
in.putback ( character );
putback ( in, std::move ( token ) );
token.type = TokenType::ERROR;
return token;
}
L2: character = in.get ( );
if ( in.eof ( ) ) {
return token;
} else if ( ( character >= '0' ) && ( character <= '9' ) ) {
token.value += character;
token.raw += character;
goto L1;
} else {
in.unget ( );
return token;
}
}
void TreeFromStringLexer::putback ( std::istream & in, TreeFromStringLexer::Token token ) const {
while ( !token.raw.empty ( ) ) {
in.putback ( token.raw.back ( ) );
token.raw.pop_back ( );
}
in.clear ( );
}
} /* namespace tree */