aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libacc/acc.cpp60
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;
}