diff options
Diffstat (limited to 'src/lexer.h')
| -rw-r--r-- | src/lexer.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/lexer.h b/src/lexer.h new file mode 100644 index 0000000..06b4bc5 --- /dev/null +++ b/src/lexer.h @@ -0,0 +1,75 @@ +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#define TAG_NULL_TEXT "" +#define TAG_TEXT_TEXT "" +#define TAG_VAR_TEXT "TMPL_VAR" +#define TAG_IF_TEXT "TMPL_IF" +#define TAG_ELSEIF_TEXT "TMPL_ELSEIF" +#define TAG_ELSE_TEXT "TMPL_ELSE" +#define TAG_LOOP_TEXT "TMPL_LOOP" +#define TAG_BREAK_TEXT "TMPL_BREAK" +#define TAG_CONTINUE_TEXT "TMPL_CONTINUE" +#define TAG_END_TEXT "TMPL_END" + +#define ATTRIBUTE_VARNAME "name" +#define ATTRIBUTE_DEFAULT "default" +#define ATTRIBUTE_VALUE "value" +#define ATTRIBUTE_LEVEL "level" + +#define SIZEOF(x) (sizeof(x) / sizeof(x[0])) + +#define TAG_NULL_LENGTH 0 +#define TAG_TEXT_LENGTH 0 +#define TAG_VAR_LENGTH SIZEOF(TAG_VAR_TEXT) +#define TAG_IF_LENGTH SIZEOF(TAG_IF_TEXT) +#define TAG_ELSEIF_LENGTH SIZEOF(TAG_ELSEIF_TEXT) +#define TAG_ELSE_LENGTH SIZEOF(TAG_ELSE_TEXT) +#define TAG_LOOP_LENGTH SIZEOF(TAG_LOOP_TEXT) +#define TAG_BREAK_LENGTH SIZEOF(TAG_BREAK_TEXT) +#define TAG_CONTINUE_LENGTH SIZEOF(TAG_CONTINUE_TEXT) +#define TAG_END_LENGTH SIZEOF(TAG_END_TEXT) + +/*The different kind of nodes we can have*/ +enum TMPL_tagtype{ + tag_null = 0,/*Should never show up*/ + tag_text = 1,/*A text sequence*/ + tag_var = 2,/*A variable to replace*/ + tag_if = 3,/*If*/ + tag_elseif = 4,/*Else if*/ + tag_else = 5,/*Else*/ + tag_end = 6,/*end if, end loop*/ + tag_loop = 7,/*Loop*/ + tag_break = 9,/*Break*/ + tag_continue = 10,/*Skip the rest of the loop and go again*/ +}; + +struct TMPL_token{ + const char* start;//Start of token + const char* end;//End of token + enum TMPL_tagtype type;//The type of token + size_t length;//Length of token, should always be end-start + struct TMPL_token* next;//The next token + struct TMPL_token* last;//The last token + unsigned int line;// Not used currently + unsigned int character;// Not used currently + struct TMPL_tagnode* into;//The tag node this item became +}TMPL_token; + +struct TMPL_token* TMPL_alloc_token(void); +void TMPL_free_token(struct TMPL_token* token); +enum TMPL_tagtype starts_with_token(const char* str, size_t strlen); +size_t tagtype_len(enum TMPL_tagtype t); +struct TMPL_token* scan_text( + const char* start, + size_t strlen, + size_t* consumed + ); +struct TMPL_token* scan_tag( + const char* start, + size_t strlen, + size_t* consumed + ); +void print_tokens(struct TMPL_token* head); |
