diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-07-31 15:29:42 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-07-31 15:29:42 -0700 |
commit | e62b6ea3e0094f244ea9756da0d094f2dbe50955 (patch) | |
tree | d6d458307d6992825a8b39c4f12ce9577562531e | |
parent | 95f2af6d232b192ffeaef2c0b5fe5678c348a7aa (diff) | |
parent | 43aaee31b9cedc059213396f1e7aa420ace0c797 (diff) | |
download | system_core-e62b6ea3e0094f244ea9756da0d094f2dbe50955.zip system_core-e62b6ea3e0094f244ea9756da0d094f2dbe50955.tar.gz system_core-e62b6ea3e0094f244ea9756da0d094f2dbe50955.tar.bz2 |
Merge change 9399
* changes:
Support the comma operator.
-rw-r--r-- | libacc/acc.cpp | 21 | ||||
-rw-r--r-- | libacc/tests/data/comma.c | 35 | ||||
-rw-r--r-- | libacc/tests/test.py | 10 |
3 files changed, 60 insertions, 6 deletions
diff --git a/libacc/acc.cpp b/libacc/acc.cpp index 823849c..da703a7 100644 --- a/libacc/acc.cpp +++ b/libacc/acc.cpp @@ -3868,7 +3868,7 @@ class Compiler : public ErrorSink { pGen->forceR0RVal(); pGen->convertR0(pCast); } else { - expr(); + commaExpr(); skip(')'); } } else if (t == '*') { @@ -4076,12 +4076,21 @@ class Compiler : public ErrorSink { } } + void commaExpr() { + for(;;) { + expr(); + if (!accept(',')) { + break; + } + } + } + void expr() { binaryOp(11); } int test_expr() { - expr(); + commaExpr(); pGen->forceR0RVal(); return pGen->gtst(0, 0); } @@ -4117,7 +4126,7 @@ class Compiler : public ErrorSink { a = test_expr(); } else { if (tok != ';') - expr(); + commaExpr(); skip(';'); n = codeBuf.getPC(); a = 0; @@ -4126,7 +4135,7 @@ class Compiler : public ErrorSink { skip(';'); if (tok != ')') { t = pGen->gjmp(0); - expr(); + commaExpr(); pGen->gjmp(n - codeBuf.getPC() - pGen->jumpOffset()); pGen->gsym(t); n = t + 4; @@ -4150,7 +4159,7 @@ class Compiler : public ErrorSink { } else { if (accept(TOK_RETURN)) { if (tok != ';') { - expr(); + commaExpr(); pGen->forceR0RVal(); if (pReturnType->tag == TY_VOID) { error("Must not return a value from a void function"); @@ -4166,7 +4175,7 @@ class Compiler : public ErrorSink { } else if (accept(TOK_BREAK)) { *(int *) l = pGen->gjmp(*(int *) l); } else if (tok != ';') - expr(); + commaExpr(); skip(';'); } } diff --git a/libacc/tests/data/comma.c b/libacc/tests/data/comma.c new file mode 100644 index 0000000..496944c --- /dev/null +++ b/libacc/tests/data/comma.c @@ -0,0 +1,35 @@ +int testReturn() { + return 10, 20, 30; +} + +int testArg(int a) { + return a; +} + +void testComma() { + int a; + 0, a = 10,20; + printf("statement: %d\n", a); + a = 1; + if (a = 0, 1) { + printf("if: a = %d\n", a); + } + int b = 0; + a = 10; + while(b++,a--) {} + printf("while: b = %d\n", b); + b = 0; + for(b++,a = 0;b++, a < 10; b++, a++) {} + printf("for: b = %d\n", b); + b = testReturn(); + printf("return: %d\n", b); + b = testArg((a,12)); + printf("arg: %d\n", b); +} + + + +int main() { + testComma(); + return 0; +} diff --git a/libacc/tests/test.py b/libacc/tests/test.py index 239bb9b..5f9a71e 100644 --- a/libacc/tests/test.py +++ b/libacc/tests/test.py @@ -354,6 +354,16 @@ result: 0""", """2 *= 5 10 16|= 1 17 """) + def testcomma(self): + self.compileCheck(["-R", "data/comma.c"], """Executing compiled code: +result: 0""", """statement: 10 +if: a = 0 +while: b = 11 +for: b = 22 +return: 30 +arg: 12 +""") + if __name__ == '__main__': if not outputCanRun(): print "Many tests are expected to fail, because acc is not a 32-bit x86 Linux executable." |