-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtokenstream.h
More file actions
122 lines (116 loc) · 3.13 KB
/
Copy pathtokenstream.h
File metadata and controls
122 lines (116 loc) · 3.13 KB
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
#pragma once
#include <cf/searchstring.h>
#include <cf/vec.h>
#include "tokentype.h"
class TokenStream {
public:
TokenStream(char* input) : input(input), currentToken(nullptr), currentTokenString("") {}
TokenStream(string& input) : input(input.c_str()), currentToken(nullptr), currentTokenString("") {}
//take next token -- removes it from the stream
QueryToken* TakeToken( );
//returns current token
QueryToken* CurrentToken( ) {
return currentToken;
}
//returns current token string
string CurrentTokenString( ) {
return currentTokenString;
}
//@returns: the query string
char* getQuery() {
return input;
}
//@param: the query string
void setQuery(char* query) {
input = query;
}
//matches token, takes if matched
bool match (TokenType type)
{
if (ReadTokenType() == type)
{
currentToken = TakeToken();
currentTokenString = currentToken->GetValue();
return true;
}
return false;
}
//reads token type at input
//MODIFIES: input, gets rid of leading whitespace if needed
TokenType ReadTokenType();
//matches token
private:
//requires input to be a c-string, null terminated
char* input;
//not the token at input, but the token that was taken last
QueryToken* currentToken;
//undefined behavior if currentToken is not a word
string currentTokenString;
};
/*
//initialize from string
TokenStream(const string& content, bool string) {
if (string)
{
std::ofstream f("temp.txt");
f << content;
f.close();
input.open("temp.txt");
}
else
input.open(content.c_str());
}
//initialize from file
TokenStream(const string& filename) {
input.open(filename.c_str());
}
//initialize from ifstream
TokenStream ( std::ifstream &stream ) {
input = std::move(stream);
}*/
/*
class Token {
public:
TokenType getType() const {
return Type;
}
string getValue() const {
return Value;
}
//default constructor
Token() : Value(""), Type(TokenInvalid) {}
//constructor
Token(const string& v, TokenType t) : Value(v), Type(t) {}
private:
TokenType Type;
string Value;
};*/
/*
class TokenTable {
public:
TokenTable() {
AddToken("OR", TokenOr);
AddToken("|", TokenOr);
AddToken("||", TokenOr);
AddToken("NOT", TokenNot);
AddToken("!", TokenNot);
AddToken("(", TokenOpenParen);
AddToken(")", TokenCloseParen);
AddToken("\"", TokenQuote);
AddToken("\'", TokenQuote);
}
Token FindToken(const string& s)
{
for (Token t : tokens)
if (t.getValue() == s)
return t;
//not enumerated token, initialize as word.
return Token(s, TokenWord);
}
private:
void AddToken(const string& token, TokenType type)
{
tokens.push_back( Token( token, type ) );
}
vector<Token> tokens;
};*/