diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2009-11-11 10:39:14 -0600 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-11-17 08:49:39 -0600 |
commit | 5ab8558d9b7e9a5e4ceb0d86f54df7391af3543d (patch) | |
tree | 16816c800937ed04e07bb1fa92b82e80bd2913b1 /json-lexer.h | |
parent | f7e6b1927f00631b1a2bf59e597ea4640dbddb31 (diff) | |
download | hqemu-5ab8558d9b7e9a5e4ceb0d86f54df7391af3543d.zip hqemu-5ab8558d9b7e9a5e4ceb0d86f54df7391af3543d.tar.gz |
Add a lexer for JSON
Our JSON parser is a three stage parser. The first stage tokenizes the stream
into a set of lexical tokens. Since the lexical grammar is regular, we can
use a finite state machine to model it. The state machine will emit tokens
as they are identified.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'json-lexer.h')
-rw-r--r-- | json-lexer.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/json-lexer.h b/json-lexer.h new file mode 100644 index 0000000..3b50c46 --- /dev/null +++ b/json-lexer.h @@ -0,0 +1,50 @@ +/* + * JSON lexer + * + * Copyright IBM, Corp. 2009 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QEMU_JSON_LEXER_H +#define QEMU_JSON_LEXER_H + +#include "qstring.h" +#include "qlist.h" + +typedef enum json_token_type { + JSON_OPERATOR = 100, + JSON_INTEGER, + JSON_FLOAT, + JSON_KEYWORD, + JSON_STRING, + JSON_ESCAPE, + JSON_SKIP, +} JSONTokenType; + +typedef struct JSONLexer JSONLexer; + +typedef void (JSONLexerEmitter)(JSONLexer *, QString *, JSONTokenType, int x, int y); + +struct JSONLexer +{ + JSONLexerEmitter *emit; + int state; + QString *token; + int x, y; +}; + +void json_lexer_init(JSONLexer *lexer, JSONLexerEmitter func); + +int json_lexer_feed(JSONLexer *lexer, const char *buffer, size_t size); + +int json_lexer_flush(JSONLexer *lexer); + +void json_lexer_destroy(JSONLexer *lexer); + +#endif |