- "/" , "(" , "-" , "+" , "=" , "[" , "]", "{", "}", "...",
- "." , "<" , ">" , "#" , "&" , "|" , "$", "@", ":", NULL
- /*
- * $,@,: are extensions:
- * $ is a shorter `self`, so instead of self.frags, $.frags
- * @ is a constructor
- * : is compiler builtin functions
- */
-};
+ "/" , "(" , ")" , "-" , "+" , "=" , "[" , "]", "{", "}", "...",
+ "." , "<" , ">" , "&" , "|" ,
+#endif
+
+#define STORE(X) { \
+ printf(X); \
+ break; \
+}
+
+void parse_debug(struct parsenode *tree) {
+ while (tree) {
+ switch (tree->type) {
+ case PARSE_TYPE_ADD: STORE("OPERATOR: ADD \n");
+ case PARSE_TYPE_BAND: STORE("OPERATOR: BITAND \n");
+ case PARSE_TYPE_BOR: STORE("OPERATOR: BITOR \n");
+ case PARSE_TYPE_COMMA: STORE("OPERATOR: SEPERATOR\n");
+ case PARSE_TYPE_DOT: STORE("OPERATOR: DOT\n");
+ case PARSE_TYPE_DIVIDE: STORE("OPERATOR: DIVIDE\n");
+ case PARSE_TYPE_EQUAL: STORE("OPERATOR: ASSIGNMENT\n");
+
+ case PARSE_TYPE_BREAK: STORE("STATEMENT: BREAK \n");
+ case PARSE_TYPE_CONTINUE: STORE("STATEMENT: CONTINUE\n");
+ case PARSE_TYPE_GOTO: STORE("STATEMENT: GOTO\n");
+ case PARSE_TYPE_RETURN: STORE("STATEMENT: RETURN\n");
+ case PARSE_TYPE_DONE: STORE("STATEMENT: DONE\n");
+
+ case PARSE_TYPE_VOID: STORE("DECLTYPE: VOID\n");
+ case PARSE_TYPE_STRING: STORE("DECLTYPE: STRING\n");
+ case PARSE_TYPE_ELIP: STORE("DECLTYPE: VALIST\n");
+ case PARSE_TYPE_ENTITY: STORE("DECLTYPE: ENTITY\n");
+ case PARSE_TYPE_FLOAT: STORE("DECLTYPE: FLOAT\n");
+ case PARSE_TYPE_VECTOR: STORE("DECLTYPE: VECTOR\n");
+
+ case PARSE_TYPE_GT: STORE("TEST: GREATER THAN\n");
+ case PARSE_TYPE_LT: STORE("TEST: LESS THAN\n");
+ case PARSE_TYPE_GTEQ: STORE("TEST: GREATER THAN OR EQUAL\n");
+ case PARSE_TYPE_LTEQ: STORE("TEST: LESS THAN OR EQUAL\n");
+ case PARSE_TYPE_LNEQ: STORE("TEST: NOT EQUAL\n");
+ case PARSE_TYPE_EQEQ: STORE("TEST: EQUAL-EQUAL\n");
+
+ case PARSE_TYPE_LBS: STORE("BLOCK: BEG\n");
+ case PARSE_TYPE_RBS: STORE("BLOCK: END\n");
+ case PARSE_TYPE_ELSE: STORE("BLOCK: ELSE\n");
+ case PARSE_TYPE_IF: STORE("BLOCK: IF\n");
+
+ case PARSE_TYPE_LAND: STORE("LOGICAL: AND\n");
+ case PARSE_TYPE_LNOT: STORE("LOGICAL: NOT\n");
+ case PARSE_TYPE_LOR: STORE("LOGICAL: OR\n");
+
+ case PARSE_TYPE_LPARTH: STORE("PARTH: BEG\n");
+ case PARSE_TYPE_RPARTH: STORE("PARTH: END\n");
+
+ case PARSE_TYPE_WHILE: STORE("LOOP: WHILE\n");
+ case PARSE_TYPE_FOR: STORE("LOOP: FOR\n");
+ case PARSE_TYPE_DO: STORE("LOOP: DO\n");
+
+ case PARSE_TYPE_IDENT: STORE("IDENT: ???\n");
+ }
+ tree = tree->next;
+ }
+}
+
+/*
+ * This just skips the token and throws it in the parse tree for later
+ * checking / optimization / codegen, it doesn't do anything with it
+ * like syntax check for legal use -- like it should as it's a TODO item
+ * which is not implemented
+ */
+#define PARSE_TODO(X) { \
+ token = lex_token(file); \
+ while (token != '\n') { \
+ token = lex_token(file); \
+ } \
+ PARSE_TREE_ADD(X); \
+ break; \
+}
+
+void parse_clear(struct parsenode *tree) {
+ if (!tree) return;
+ struct parsenode *temp = NULL;
+ while (tree != NULL) {
+ temp = tree;
+ tree = tree->next;
+ mem_d (temp);
+ }
+}