aboutsummaryrefslogtreecommitdiff
path: root/src/lexer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.h')
-rw-r--r--src/lexer.h75
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);