diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2019-08-28 17:28:55 -0400 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2019-08-28 17:28:55 -0400 |
| commit | 06087b10ec7a897ad48db83f7f33a8fc11fa9341 (patch) | |
| tree | 4e6c539bf89d08deec84ffec35797fc7306022b1 /src/lexer.h | |
| parent | 192115300aa8349a4c85535466386cbf99259fdd (diff) | |
| download | libctemplates-06087b10ec7a897ad48db83f7f33a8fc11fa9341.tar.gz libctemplates-06087b10ec7a897ad48db83f7f33a8fc11fa9341.tar.bz2 libctemplates-06087b10ec7a897ad48db83f7f33a8fc11fa9341.zip | |
Added break statement to templates
Added a break statement that can break out of loops, also added
some tests to test the functionality of the same.
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); |
