]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - gmqcc.h
Fixed parsing issues, added some parser tests.
[xonotic/gmqcc.git] / gmqcc.h
diff --git a/gmqcc.h b/gmqcc.h
index 091725b16807df9396c2f4a309f69b4b9fdeb580..5acfbd57963ca3eeaaff524b951b0791fdda00b2 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
 #define INSTR_BITAND    59
 #define INSTR_BITOR     60
 
-#define mem_a(x) malloc(x)
-#define mem_d(x) free  (x)
-
 /*
  * This is the smallest lexer I've ever wrote: and I must say, it's quite
  * more nicer than those large bulky complex parsers that most people write
@@ -140,12 +137,13 @@ struct lex_file {
        int   current;
        int   length;
        int   size;
+       long  line;         /* Line the lexer is on                     */
        char  lastok[8192]; /* No token shall ever be bigger than this! */
 };
 
 /*
  * It's important that this table never exceed 32 keywords, the ascii
- * table starts at 33 (which we need)
+ * table starts at 33 (and we don't want conflicts)
  */
 #define TOKEN_DO       0
 #define TOKEN_ELSE     1
@@ -156,44 +154,63 @@ struct lex_file {
 #define TOKEN_RETURN   6
 #define TOKEN_GOTO     7
 #define TOKEN_FOR      8   // extension
-#define TOKEN_INT      9   // extension
-#define TOKEN_BOOL     10  // extension
-#define TOKEN_VOID     11
-#define TOKEN_STRING   12
-#define TOKEN_FLOAT    13
-#define TOKEN_VECTOR   14
-#define TOKEN_ENTITY   15
+#define TOKEN_TYPEDEF  9   // extension
+
+
+#define TOKEN_FLOAT    110
+#define TOKEN_VECTOR   111
+#define TOKEN_STRING   112
+#define TOKEN_ENTITY   113
+#define TOKEN_VOID     114
 
 /*
  * Lexer state constants, these are numbers for where exactly in
  * the lexing the lexer is at. Or where it decided to stop if a lexer
  * error occurs.
  */
-#define LEX_COMMENT    128 /* higher than ascii */
-#define LEX_CHRLIT     129
-#define LEX_STRLIT     130
-#define LEX_IDENT      131
-#define LEX_DO         132
-#define LEX_ELSE       133
-#define LEX_IF         134
-#define LEX_WHILE      135
-#define LEX_INCLUDE    136
-#define LEX_DEFINE     137
+#define LEX_COMMENT    1128 /* higher than ascii */
+#define LEX_CHRLIT     1129
+#define LEX_STRLIT     1130
+#define LEX_IDENT      1131
 
 int              lex_token(struct lex_file *);
 void             lex_reset(struct lex_file *);
-int              lex_debug(struct lex_file *);
 int              lex_close(struct lex_file *);
-struct lex_file *lex_open (const char *);
+struct lex_file *lex_open (FILE *);
 
 /* errors */
 #define ERROR_LEX      (SHRT_MAX+0)
 #define ERROR_PARSE    (SHRT_MAX+1)
 #define ERROR_INTERNAL (SHRT_MAX+2)
 #define ERROR_COMPILER (SHRT_MAX+3)
+#define ERROR_PREPRO   (SHRT_MAX+4)
 int error(int, const char *, ...);
 
 /* parse.c */
 int parse(struct lex_file *);
+struct parsenode {
+       struct parsenode *next;
+       int               type; /* some token */
+};
 
+/* typedef.c */
+typedef struct typedef_node_t {
+       char      *name; /* name of actual type */
+} typedef_node;
+
+void          typedef_init();
+void          typedef_clear();
+typedef_node *typedef_find(const char *);
+int           typedef_add (const char *, const char *);
+
+/* alloc.c */
+void *memory_a(unsigned int, unsigned int, const char *);
+void  memory_d(void       *, unsigned int, const char *);
+#ifdef NOTRACK
+#      define mem_a(x) malloc(x)
+#      define mem_d(x) free  (x)
+#else
+#      define mem_a(x) memory_a((x), __LINE__, __FILE__)
+#      define mem_d(x) memory_d((x), __LINE__, __FILE__)
+#endif
 #endif