#ifndef LEXER_H #define LEXER_H #include typedef enum stmt_type stmt_type; typedef enum cond_type cond_type; typedef struct alt_stmt alt_stmt; typedef struct cond_stmt cond_stmt; typedef struct stmt stmt; enum stmt_type { STMT_DIR, STMT_FUNC, STMT_EXPR, STMT_COND, STMT_COMP, NUM_STMTS }; enum cond_type { COND_IF, COND_FOR, COND_WHILE, COND_DO_WHILE, NUM_CONDS }; struct alt_stmt { int type; size_t offset; void *(*lex)(char **str, int dbg); }; struct cond_stmt { cond_type type; expr *expr; stmt *stmt; }; struct stmt { stmt_type type; union { dir *dir; func *func; expr *expr; cond_stmt *cond_stmt; stmt *down; }; stmt *next; }; extern int lex(char *str, int dbg); #endif