54 static const struct keyword keywords[] = {
105 {
"PROJECT", PROJECT},
106 {
"MAXHEAP", MAXHEAP},
107 {
"MEMHASH", MEMHASH},
109 {
"RELATION", RELATION},
111 {
"ATTRIBUTE", ATTRIBUTE}
115 static const int8_t skip_hint[] = {0, 13, 21, 27, 33, 36, 44, 47, 48};
117 static char separators[] =
"#.;,() \t\n";
120 lexer_start(lexer_t *lexer,
char *
input, token_t *token, value_t *value)
122 lexer->input =
input;
123 lexer->prev_pos =
input;
124 lexer->token = token;
125 lexer->value = value;
131 get_token_id(
const char *
string,
const size_t length)
136 if(
sizeof(skip_hint) < length || length < 1) {
141 start = skip_hint[length - 1];
142 if(
sizeof(skip_hint) == length) {
143 end =
sizeof(keywords) /
sizeof(keywords[0]);
145 end = skip_hint[length];
148 for(i = start; i < end; i++) {
149 if(strncasecmp(keywords[i].
string,
string, length) == 0) {
150 return keywords[i].token;
158 next_real(lexer_t *lexer,
const char *s)
162 #if DB_FEATURE_FLOATS 167 long_value = strtol(s, &end, 10);
169 #if DB_FEATURE_FLOATS 172 float_value = strtof(s, &end);
173 if(float_value == 0 && s == end) {
176 memcpy(lexer->value, &float_value,
sizeof(float_value));
177 *lexer->token = FLOAT_VALUE;
185 if(long_value == 0 && errno != 0) {
188 memcpy(lexer->value, &long_value,
sizeof(long_value));
189 *lexer->token = INTEGER_VALUE;
196 next_string(lexer_t *lexer,
const char *s)
201 end = strchr(s,
'\'');
207 *lexer->token = STRING_VALUE;
208 lexer->input = end + 1;
210 if(length > DB_MAX_ELEMENT_SIZE - 1) {
211 length = DB_MAX_ELEMENT_SIZE - 1;
214 memcpy(lexer->value, s, length);
215 (*lexer->value)[length] =
'\0';
221 next_token(lexer_t *lexer,
const char *s)
225 length = strcspn(s, separators);
232 *lexer->token = get_token_id(s, length);
233 lexer->input = s + length;
234 if(*lexer->token != NONE) {
241 *lexer->token = IDENTIFIER;
243 if(length > DB_MAX_ELEMENT_SIZE - 1) {
244 length = DB_MAX_ELEMENT_SIZE - 1;
247 memcpy(lexer->value, s, length);
248 (*lexer->value)[length] =
'\0';
254 lexer_next(lexer_t *lexer)
258 *lexer->token = NONE;
260 s += strspn(s,
" \t\n");
266 return next_string(lexer, s + 1);
270 if(isdigit((
int)*s) || (*s ==
'-' && isdigit((
int)s[1]))) {
271 return next_real(lexer, s);
275 return next_token(lexer, s);
280 lexer_rewind(lexer_t *lexer)
282 lexer->input = lexer->prev_pos;
static bool start(void)
Start measurement.
Definitions and declarations for AQL, the Antelope Query Language.
static void input(void)
Process a received 6lowpan packet.