/* la.h */ #include "io.h" #include #define hash_table_size 5000 typedef enum { SKunknown, SKidentifier, SKendoffile, SKinteger, SKfloat, SKbegin, SKend, SKopenpar, SKclosepar, SKsemicolon, SKstring, SKcomma, SKopensquare, SKclosesquare, SKnull, FirstReservedWord, RWif, RWelse, RWwhile, RWreturn, LastReservedWord, FirstType, TYint, TYfloat, TYchar, TYvoid, TYstruct, LastType, OPplus, OPminus, OPstar, OPdivide, OPmod, OPplusequal, OPminusequal, OPstarequal, OPdivideequal, OPmodequal, OPequal, OPdot, OParrow, OPnot, OPand, OPor, OPaddress, OPequalequal, OPless, OPgreater, OPnotequal, OPlessequal, OPgreaterequal, OPFplus, OPFminus, OPFstar, OPFdivide, OPFplusequal, OPFminusequal, OPFstarequal, OPFdivideequal, OPFequalequal, OPFless, OPFgreater, OPFnotequal, OPFlessequal, OPFgreaterequal, } SymbolKind; typedef struct S { char *name; SymbolKind kind; void *decls; struct S *next; } SymbolDescription; typedef SymbolDescription *HashTable[hash_table_size]; extern HashTable symbol_table; extern SymbolKind lex_kind; extern int lex_integer; extern float lex_float; extern SymbolDescription *lex_symbol; extern char lex_name[]; extern int already_got_lexeme; void get_lexeme(void); SymbolDescription *lookup_symbol(char *name); void print_lexeme(FILE *f); void test_lexical_analyser(void); void init_lexical_analyser(void); void print_string(FILE *f, char *s); void print_operator(FILE *f, SymbolKind op); void print_type_symbol(FILE *f, SymbolKind op); void print_identifier(FILE *f, SymbolDescription *id);