diff options
| -rw-r--r-- | libacc/acc.cpp | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/libacc/acc.cpp b/libacc/acc.cpp index 8b3765a3..7d14e3fd 100644 --- a/libacc/acc.cpp +++ b/libacc/acc.cpp @@ -2254,8 +2254,9 @@ class Compiler : public ErrorSink { next(); } else if (t == EOF ) { error("Unexpected EOF."); - } else if (t < TOK_UNDEFINED_SYMBOL) { - error("Unexpected symbol or keyword"); + } else if (!checkSymbol(t, &tString)) { + // Don't have to do anything special here, the error + // message was printed by checkSymbol() above. } else { if (t == TOK_UNDEFINED_SYMBOL) { t = (intptr_t) mSymbolTable.addGlobal( @@ -2370,7 +2371,10 @@ class Compiler : public ErrorSink { void block(intptr_t l, bool outermostFunctionBlock) { intptr_t a, n, t; - if (tok == TOK_IF) { + if (tok == TOK_INT || tok == TOK_CHAR) { + /* declarations */ + localDeclarations(); + } else if (tok == TOK_IF) { next(); skip('('); a = test_expr(); @@ -2418,8 +2422,6 @@ class Compiler : public ErrorSink { mSymbolTable.pushLevel(); } next(); - /* declarations */ - localDeclarations(); while (tok != '}' && tok != EOF) block(l, false); skip('}'); @@ -2524,14 +2526,22 @@ class Compiler : public ErrorSink { while (acceptType(base)) { while (tok != ';' && tok != EOF) { Type t = acceptPointerDeclaration(t); + int variableAddress = 0; if (checkSymbol()) { addLocalSymbol(); if (tok) { loc = loc + 4; - *(int *) tok = -loc; + variableAddress = -loc; + ((VariableInfo*) tok)->pAddress = (void*) variableAddress; } } next(); + if (tok == '=') { + /* assignment */ + next(); + expr(); + pGen->storeR0(variableAddress); + } if (tok == ',') next(); } @@ -2540,27 +2550,30 @@ class Compiler : public ErrorSink { } bool checkSymbol() { - bool result = isSymbol(); + return checkSymbol(tok, &mTokenString); + } + + bool checkSymbol(int token, String* pText) { + bool result = token < EOF || token >= TOK_UNDEFINED_SYMBOL; if (!result) { String temp; - if (tok >= 0 && tok < 256) { - temp.printf("char \'%c\'", tok); - } else if (tok >= TOK_KEYWORD && tok < TOK_UNSUPPORTED_KEYWORD) { - temp.printf("keyword \"%s\"", mTokenString.getUnwrapped()); + if (token == EOF ) { + temp.printf("EOF"); + } else if (token == TOK_NUM) { + temp.printf("numeric constant"); + } else if (token >= 0 && token < 256) { + temp.printf("char \'%c\'", token); + } else if (token >= TOK_KEYWORD && token < TOK_UNSUPPORTED_KEYWORD) { + temp.printf("keyword \"%s\"", pText->getUnwrapped()); } else { temp.printf("reserved keyword \"%s\"", - mTokenString.getUnwrapped()); + pText->getUnwrapped()); } error("Expected symbol. Got %s", temp.getUnwrapped()); } return result; } - /* Is a possibly undefined symbol */ - bool isSymbol() { - return tok < EOF || tok >= TOK_UNDEFINED_SYMBOL; - } - void globalDeclarations() { while (tok != EOF) { Type base; @@ -2579,12 +2592,23 @@ class Compiler : public ErrorSink { mTokenString.getUnwrapped()); } next(); - if (tok == ',' || tok == ';') { + if (tok == ',' || tok == ';' || tok == '=') { // it's a variable declaration for(;;) { if (name) { name->pAddress = (int*) allocGlobalSpace(4); } + if (tok == '=') { + next(); + if (tok == TOK_NUM) { + if (name) { + * (int*) name->pAddress = tokc; + } + next(); + } else { + error("Expected an integer constant"); + } + } if (tok != ',') { break; } |
