diff options
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-lexer.h')
-rw-r--r-- | pigeonhole/src/lib-sieve/sieve-lexer.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/sieve-lexer.h b/pigeonhole/src/lib-sieve/sieve-lexer.h new file mode 100644 index 0000000..95451cc --- /dev/null +++ b/pigeonhole/src/lib-sieve/sieve-lexer.h @@ -0,0 +1,119 @@ +#ifndef SIEVE_LEXER_H +#define SIEVE_LEXER_H + +#include "lib.h" +#include "str.h" + +#include "sieve-common.h" + +enum sieve_token_type { + STT_NONE, + STT_WHITESPACE, + STT_EOF, + + STT_NUMBER, + STT_IDENTIFIER, + STT_TAG, + STT_STRING, + + STT_RBRACKET, + STT_LBRACKET, + STT_RCURLY, + STT_LCURLY, + STT_RSQUARE, + STT_LSQUARE, + STT_SEMICOLON, + STT_COMMA, + + /* These are currently not used in the lexical specification, but a + token is assigned to these to generate proper error messages (these + are technically not garbage and possibly part of mistyped but + otherwise valid tokens). + */ + STT_SLASH, + STT_COLON, + + /* Error tokens */ + STT_GARBAGE, /* Error reporting deferred to parser */ + STT_ERROR /* Lexer is responsible for error, parser won't report + additional errors */ +}; + +/* + * Lexer object + */ + +struct sieve_lexical_scanner; + +struct sieve_lexer { + struct sieve_lexical_scanner *scanner; + + enum sieve_token_type token_type; + string_t *token_str_value; + sieve_number_t token_int_value; + + int token_line; +}; + +const struct sieve_lexer * +sieve_lexer_create(struct sieve_script *script, + struct sieve_error_handler *ehandler, + enum sieve_error *error_r); +void sieve_lexer_free(const struct sieve_lexer **lexer); + +/* + * Scanning + */ + +void sieve_lexer_skip_token(const struct sieve_lexer *lexer); + +/* + * Token access + */ + +static inline enum sieve_token_type +sieve_lexer_token_type(const struct sieve_lexer *lexer) +{ + return lexer->token_type; +} + +static inline const string_t * +sieve_lexer_token_str(const struct sieve_lexer *lexer) +{ + i_assert(lexer->token_type == STT_STRING); + + return lexer->token_str_value; +} + +static inline const char * +sieve_lexer_token_ident(const struct sieve_lexer *lexer) +{ + i_assert(lexer->token_type == STT_TAG || + lexer->token_type == STT_IDENTIFIER); + + return str_c(lexer->token_str_value); +} + +static inline sieve_number_t +sieve_lexer_token_int(const struct sieve_lexer *lexer) +{ + i_assert(lexer->token_type == STT_NUMBER); + + return lexer->token_int_value; +} + +static inline bool sieve_lexer_eof(const struct sieve_lexer *lexer) +{ + return lexer->token_type == STT_EOF; +} + +static inline int sieve_lexer_token_line(const struct sieve_lexer *lexer) +{ + return lexer->token_line; +} + +const char *sieve_lexer_token_description(const struct sieve_lexer *lexer); + +void sieve_lexer_token_print(const struct sieve_lexer *lexer); + +#endif |