Use a separate table for keywords.
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index e7f95b0..fb4f4f6 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -1204,8 +1204,8 @@
      */
     class FakeString : public String {
     public:
-        FakeString(char* string, size_t length) :
-            String(string, length, true) {}
+        FakeString(const char* string, size_t length) :
+            String((char*) string, length, true) {}
 
         ~FakeString() {
             orphan();
@@ -1220,6 +1220,7 @@
 
         ~StringTable() {
             clear();
+            hashmapFree(mpMap);
         }
 
         void clear() {
@@ -1278,6 +1279,71 @@
         MacroTable() : StringTable<String>(10) {}
     };
 
+    class KeywordTable {
+    public:
+
+        KeywordTable(){
+            mpMap = hashmapCreate(40, hashFn, equalsFn);
+            put("int", TOK_INT);
+            put("char", TOK_CHAR);
+            put("void", TOK_VOID);
+            put("if", TOK_IF);
+            put("else", TOK_ELSE);
+            put("while", TOK_WHILE);
+            put("break", TOK_BREAK);
+            put("return", TOK_RETURN);
+            put("for", TOK_FOR);
+            put("pragma", TOK_PRAGMA);
+        }
+
+        ~KeywordTable() {
+            hashmapFree(mpMap);
+        }
+
+        int get(char* key) {
+            return (int) hashmapGet(mpMap, key);
+        }
+
+        const char* lookupKeyFor(int value) {
+            FindValContext context;
+            context.key = 0;
+            hashmapForEach(mpMap, findKeyFn, &context);
+            return context.key;
+        }
+
+    private:
+        void put(const char* kw, int val) {
+            hashmapPut(mpMap, (void*) kw, (void*) val);
+        }
+
+        static int hashFn(void* pKey) {
+            char* pString = (char*) pKey;
+            return hashmapHash(pString, strlen(pString));
+        }
+
+        static bool equalsFn(void* keyA, void* keyB) {
+            const char* pStringA = (const char*) keyA;
+            const char* pStringB = (const char*) keyB;
+            return strcmp(pStringA, pStringB)  == 0;
+        }
+
+        struct FindValContext {
+            char* key;
+            int value;
+        };
+
+        static bool findKeyFn(void* key, void* value, void* context) {
+            FindValContext* pContext = (FindValContext*) context;
+            if ((int) value == pContext->value) {
+                pContext->key = (char*) key;
+                return false;
+            }
+            return true;
+        }
+
+        Hashmap* mpMap;
+    };
+
     template<class E> class Array {
         public:
         Array() {
@@ -1346,6 +1412,11 @@
         int oldCh;
     };
 
+    struct VariableInfo {
+        void* pA;
+        void* pB;
+    };
+
 
     int ch; // Current input character, or EOF
     intptr_t tok;     // token
@@ -1360,7 +1431,8 @@
     int dch;    // Macro state: Saves old value of ch during a macro playback.
     char* last_id;
     char* pGlobalBase;
-    char* pVarsBase; // Value of variables
+    VariableInfo* pVarsBase; // Value of variables
+    KeywordTable mKeywords;
 
     InputStream* file;
 
@@ -1377,20 +1449,22 @@
 
     static const int ALLOC_SIZE = 99999;
 
-    // Indentifiers start at 0x100 and increase by # (chars + 1) * 8
-    static const int TOK_IDENT = 0x100;
-    static const int TOK_INT = 0x100;
-    static const int TOK_CHAR = TOK_INT + 4*8;
-    static const int TOK_VOID = TOK_CHAR + 5*8;
-    static const int TOK_IF = TOK_VOID + 5*8;
-    static const int TOK_ELSE = TOK_IF + 3*8;
-    static const int TOK_WHILE = TOK_ELSE + 5*8;
-    static const int TOK_BREAK = TOK_WHILE + 6*8;
-    static const int TOK_RETURN = TOK_BREAK + 6*8;
-    static const int TOK_FOR = TOK_RETURN + 7*8;
-    static const int TOK_PRAGMA = TOK_FOR + 4*8;
-    static const int TOK_DEFINE = TOK_PRAGMA + 7*8;
-    static const int TOK_MAIN = TOK_DEFINE + 7*8;
+    // Keywords start at 0x100 and increase by 1
+    static const int TOK_KEYWORD = 0x100;
+    static const int TOK_INT = TOK_KEYWORD + 0;
+    static const int TOK_CHAR = TOK_KEYWORD + 1;
+    static const int TOK_VOID = TOK_KEYWORD + 2;
+    static const int TOK_IF = TOK_KEYWORD + 3;
+    static const int TOK_ELSE = TOK_KEYWORD + 4;
+    static const int TOK_WHILE = TOK_KEYWORD + 5;
+    static const int TOK_BREAK = TOK_KEYWORD + 6;
+    static const int TOK_RETURN = TOK_KEYWORD + 7;
+    static const int TOK_FOR = TOK_KEYWORD + 8;
+    static const int TOK_PRAGMA = TOK_KEYWORD + 9;
+    static const int TOK_DEFINE = TOK_KEYWORD + 10;
+
+    // Symbols start at 0x200
+    static const int TOK_SYMBOL = 0x200;
 
     static const int TOK_DUMMY = 1;
     static const int TOK_NUM = 2;
@@ -1514,18 +1588,20 @@
                     inp();
                     next();
                 } else {
-                    * dstk = TAG_TOK; /* no need to mark end of string (we
-                     suppose data is initialized to zero by calloc) */
-                    tok = (intptr_t) (strstr(sym_stk, (last_id - 1))
-                            - sym_stk);
-                    * dstk = 0; /* mark real end of ident for dlsym() */
-                    tok = tok * 8 + TOK_IDENT;
-                    if (tok > TOK_DEFINE) {
-                        if (tok + 8 > ALLOC_SIZE) {
-                            error("Variable Table overflow.");
-                        }
-                        tok = (intptr_t) (pVarsBase + tok);
-                        /*        printf("tok=%s %x\n", last_id, tok); */
+                    // Is this a keyword?
+                    * dstk = 0;
+                    int kwtok = mKeywords.get(last_id);
+                    if (kwtok) {
+                        tok = kwtok;
+                        // fprintf(stderr, "tok= keyword %s %x\n", last_id, tok);
+                    } else {
+                        * dstk = TAG_TOK; /* no need to mark end of string (we
+                         suppose data is initialized to zero by calloc) */
+                        tok = (intptr_t) (strstr(sym_stk, (last_id - 1))
+                                - sym_stk);
+                        * dstk = 0; /* mark real end of ident for dlsym() */
+                        tok = (intptr_t) & (pVarsBase[tok]);
+                        // fprintf(stderr, "tok= symbol %s %x\n", last_id, tok);
                     }
                 }
             }
@@ -1583,15 +1659,19 @@
         }
 #if 0
         {
-            char* p;
+            const char* p;
 
             printf("tok=0x%x ", tok);
-            if (tok >= TOK_IDENT) {
+            if (tok >= TOK_KEYWORD) {
                 printf("'");
-                if (tok> TOK_DEFINE)
-                p = sym_stk + 1 + ((char*) tok - pVarsBase - TOK_IDENT) / 8;
-                else
-                p = sym_stk + 1 + (tok - TOK_IDENT) / 8;
+                if (tok>= TOK_SYMBOL)
+                    p = sym_stk + 1 + ((char*) tok - (char*) pVarsBase) / 8;
+                else {
+                    p = mKeywords.lookupKeyFor(tok);
+                    if (!p) {
+                        p = "unknown keyword";
+                    }
+                }
                 while (*p != TAG_TOK && *p)
                 printf("%c", *p++);
                 printf("'\n");
@@ -1979,7 +2059,7 @@
     }
 
     void checkSymbol() {
-        if (tok <= TOK_DEFINE) {
+        if (tok < TOK_SYMBOL) {
             error("Expected a symbol");
         }
     }
@@ -2174,15 +2254,10 @@
         pGen->init(&codeBuf);
         file = new TextInputStream(text, textLength);
         sym_stk = (char*) calloc(1, ALLOC_SIZE);
-        static const char* predefinedSymbols =
-            " int char void"
-            " if else while break return for"
-            " pragma define main ";
-        dstk = strcpy(sym_stk, predefinedSymbols)
-                + strlen(predefinedSymbols);
+        dstk = sym_stk;
         pGlobalBase = (char*) calloc(1, ALLOC_SIZE);
         glo = pGlobalBase;
-        pVarsBase = (char*) calloc(1, ALLOC_SIZE);
+        pVarsBase = (VariableInfo*) calloc(1, ALLOC_SIZE);
         inp();
         next();
         globalDeclarations();
@@ -2195,16 +2270,6 @@
         return result;
     }
 
-    int run(int argc, char** argv) {
-        typedef int (*mainPtr)(int argc, char** argv);
-        mainPtr aMain = (mainPtr) *(int*) (pVarsBase + TOK_MAIN);
-        if (!aMain) {
-            fprintf(stderr, "Could not find function \"main\".\n");
-            return -1;
-        }
-        return aMain(argc, argv);
-    }
-
     int dump(FILE* out) {
         fwrite(codeBuf.getBase(), 1, codeBuf.getSize(), out);
         return 0;
@@ -2233,13 +2298,9 @@
                 if (memcmp(pSym, name, nameLen) == 0
                         && pSym[nameLen] == TAG_TOK) {
                     int tok = pSym - 1 - sym_stk;
-                    tok = tok * 8 + TOK_IDENT;
-                    if (tok <= TOK_DEFINE) {
-                        return 0;
-                    } else {
-                        tok = (intptr_t) (pVarsBase + tok);
-                        return * (void**) tok;
-                    }
+                    tok = tok * sizeof(VariableInfo);
+                    tok = (intptr_t) ((intptr_t) pVarsBase + tok);
+                    return * (void**) tok;
                 }
             }
         }
diff --git a/libacc/tests/main.cpp b/libacc/tests/main.cpp
index d624cbb..4f8a65d 100644
--- a/libacc/tests/main.cpp
+++ b/libacc/tests/main.cpp
@@ -109,16 +109,20 @@
         }
     }
 
-    accGetScriptLabel(script, "main", (ACCvoid**) & mainPointer);
+    if (runResults) {
+        accGetScriptLabel(script, "main", (ACCvoid**) & mainPointer);
 
-    result = accGetError(script);
-    if (result == ACC_NO_ERROR && runResults) {
-        fprintf(stderr, "Executing compiled code:\n");
-        int codeArgc = argc - i + 1;
-        char** codeArgv = argv + i - 1;
-        codeArgv[0] = (char*) (inFile ? inFile : "stdin");
-        result = run(mainPointer, codeArgc, codeArgv);
-        fprintf(stderr, "result: %d\n", result);
+        result = accGetError(script);
+        if (result != ACC_NO_ERROR) {
+            fprintf(stderr, "Could not find main: %d\n", result);
+        } else {
+            fprintf(stderr, "Executing compiled code:\n");
+            int codeArgc = argc - i + 1;
+            char** codeArgv = argv + i - 1;
+            codeArgv[0] = (char*) (inFile ? inFile : "stdin");
+            result = run(mainPointer, codeArgc, codeArgv);
+            fprintf(stderr, "result: %d\n", result);
+        }
     }
 
 exit: