From b10d1005fbb6c1c9505f995968297f2ad97f213b Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Mon, 9 Apr 2012 19:47:20 -0400 Subject: [PATCH] Implemented typedefs --- Makefile | 4 +- gmqcc | Bin 22074 -> 0 bytes gmqcc.h | 9 +++ lex.c | 10 +++- parse.c | 20 ++++--- typedef.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 192 insertions(+), 11 deletions(-) delete mode 100755 gmqcc create mode 100644 typedef.c diff --git a/Makefile b/Makefile index 98f79a1..7690c66 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CC = gcc CFLAGS = -O3 -Wall -OBJ = main.o lex.o error.o parse.o cpp.o +OBJ = main.o lex.o error.o parse.o cpp.o typedef.o %.o: %.c $(CC) -c -o $@ $< $(CFLAGS) @@ -9,4 +9,4 @@ gmqcc: $(OBJ) $(CC) -o $@ $^ $(CFLAGS) clean: - rm -f *.o dpqcc + rm -f *.o gmqcc diff --git a/gmqcc b/gmqcc deleted file mode 100755 index d00f3c7c3d36e9d63116895ef8972befc6e20940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22074 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 ++; return ch; + } lex_unget(ch, file); return ' '; @@ -291,6 +293,12 @@ int lex_token(struct lex_file *file) { if (!strncmp(file->lastok, lex_keywords[it], sizeof(lex_keywords[it]))) return it; + /* try the hashtable for typedefs? */ + if (typedef_find(file->lastok)) + for (it = 0; it < sizeof(lex_keywords)/sizeof(*lex_keywords); it++) + if (!strncmp(typedef_find(file->lastok)->name, lex_keywords[it], sizeof(lex_keywords[it]))) + return it; + return LEX_IDENT; } return ch; diff --git a/parse.c b/parse.c index 7320c9e..f2566d6 100644 --- a/parse.c +++ b/parse.c @@ -208,6 +208,12 @@ int parse(struct lex_file *file) { PARSE_TREE_ADD(PARSE_TYPE_FOR); break; + case LEX_IDENT: + token = lex_token(file); + printf("FOO: %s\n", file->lastok); + break; + + case TOKEN_DO: PARSE_TODO(PARSE_TYPE_DO); case TOKEN_WHILE: PARSE_TODO(PARSE_TYPE_WHILE); case TOKEN_BREAK: PARSE_TODO(PARSE_TYPE_BREAK); @@ -243,17 +249,16 @@ int parse(struct lex_file *file) { if (token == '&') { /* && */ token = lex_token(file); PARSE_TREE_ADD(PARSE_TYPE_LAND); - goto end; + break; } PARSE_TREE_ADD(PARSE_TYPE_BAND); - printf("--> BITWISE AND\n"); break; case '|': /* | */ token = lex_token(file); if (token == '|') { /* || */ token = lex_token(file); PARSE_TREE_ADD(PARSE_TYPE_LOR); - goto end; + break; } PARSE_TREE_ADD(PARSE_TYPE_BOR); break; @@ -262,7 +267,7 @@ int parse(struct lex_file *file) { if (token == '=') { /* != */ token = lex_token(file); PARSE_TREE_ADD(PARSE_TYPE_LNEQ); - goto end; + break; } PARSE_TREE_ADD(PARSE_TYPE_LNOT); break; @@ -271,7 +276,7 @@ int parse(struct lex_file *file) { if (token == '=') { /* <= */ token = lex_token(file); PARSE_TREE_ADD(PARSE_TYPE_LTEQ); - goto end; + break; } PARSE_TREE_ADD(PARSE_TYPE_LT); break; @@ -280,7 +285,7 @@ int parse(struct lex_file *file) { if (token == '=') { /* >= */ token = lex_token(file); PARSE_TREE_ADD(PARSE_TYPE_GTEQ); - goto end; + break; } PARSE_TREE_ADD(PARSE_TYPE_GT); break; @@ -289,7 +294,7 @@ int parse(struct lex_file *file) { if (token == '=') { /* == */ token = lex_token(file); PARSE_TREE_ADD(PARSE_TYPE_EQEQ); - goto end; + break; } PARSE_TREE_ADD(PARSE_TYPE_EQUAL); break; @@ -322,7 +327,6 @@ int parse(struct lex_file *file) { PARSE_TREE_ADD(PARSE_TYPE_RBS); break; } - end:; } parse_debug(parseroot); lex_reset(file); diff --git a/typedef.c b/typedef.c new file mode 100644 index 0000000..70a2fe4 --- /dev/null +++ b/typedef.c @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2012 + * Dale Weiler + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include +#include /* replace if stdint.h doesn't exist! */ +#include "gmqcc.h" + +/* + * This implements a hashtable for typedef type keywords which end up + * being translated to their full-expressed type. This uses a singly + * linked list with a fast hash function. + */ +static typedef_node *typedef_table[1024]; + +void typedef_init() { + int i; + for(i = 0; i < sizeof(typedef_table)/sizeof(*typedef_table); i++) + typedef_table[i] = NULL; +} + +/* + * Fast collisionless hashfunction based off of: + * http://www.azillionmonkeys.com/qed/hash.html + * By: Paul Hsieh + * + * The code is licensed under LGPL 2.1 or Paul + * Hsieh's derivative license. Stated on his page + * quote: + * + * The LGPL 2.1 is not necessarily a more liberal license than my + * derivative license, but this additional licensing makes the code + * available to more developers. Note that this does not give you + * multi-licensing rights. You can only use the code under one of + * the licenses at a time. + * + * Paul Hsieh derivative license + * + * The derivative content includes raw computer source code, ideas, + * opinions, and excerpts whose original source is covered under + * another license and transformations of such derivatives. + * Note that mere excerpts by themselves (with the exception of raw + * source code) are not considered derivative works under this license. + * Use and redistribution is limited to the following conditions: + * + * One may not create a derivative work which, in any way, violates the + * Paul Hsieh exposition license described above on the original content. + * + * One may not apply a license to a derivative work that precludes anyone + * else from using and redistributing derivative content. + * + * One may not attribute any derivative content to authors not involved + * in the creation of the content, though an attribution to the author + * is not necessary. + * + * Paul Hsieh exposition license + * + * The content of all text, figures, tables and displayed layout is + * copyrighted by its author and owner Paul Hsieh unless specifically + * denoted otherwise. Redistribution is limited to the following conditions: + * + * The redistributor must fully attribute the content's authorship and + * make a good faith effort to cite the original location of the original + * content. + * + * The content may not be modified via excerpt or otherwise with the + * exception of additional citations such as described above without prior + * consent of Paul Hsieh. + * + * The content may not be subject to a change in license without prior + * consent of Paul Hsieh. + * + * The content may be used for commercial purposes. + */ + +#if (defined(__GNUC__) && defined(__i386__)) || defined(_MSC_VER) +/* + * Unalligned loads are faster if we can do them, otherwise fall back + * to safer version below. + */ +# define load16(D) (*((const uint16_t*)(D))) +#else +# define load16(D) ((((uint32_t)(((const uint8_t*)(D))[1])) << 8) + \ + (uint32_t)(((const uint8_t*)(D))[0])) +#endif +unsigned int inline typedef_hash(const char *data) { + uint32_t hash = strlen(data); + uint32_t size = hash; + uint32_t temp = 0; + + int last; + if (size <= 0|| data == NULL) + return -1; + + last = size & 3; + size >>= 2; + + /* main loop */ + for (;size > 0; size--) { + hash += (load16(data)); + temp = (load16(data+2) << 11) ^ hash; + hash = (hash << 16) ^ temp; + data += sizeof(uint16_t) << 1; + hash += hash >> 11; + } + + /* ends */ + switch (last) { + case 3: + hash += load16(data); + hash ^= hash << 16; + hash ^= ((signed char)data[sizeof(uint16_t)]) << 8; + hash += hash >> 11; + break; + case 2: + hash += load16(data); + hash ^= hash << 11; + hash += hash >> 17; + break; + case 1: + hash += (signed char)*data; + hash ^= hash << 10; + hash += hash >> 1; + break; + } + + /* force avalanching of final 127 bits */ + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + + return hash % 1024; +} + +typedef_node *typedef_find(const char *s) { + unsigned int hash = typedef_hash(s); + typedef_node *find = typedef_table[hash]; + return find; +} -- 2.39.2