ACC is a project that its only aim is to improve my knowledge of two topics, C language and ARM assembly. I think this is a good exercise to go deep into both topics.
Parser
The ACC is a LALR(1) parser, that means it is a Look-Ahead Left-to-Right parser.
Grammar
S -> int main "(" ")" "{" E "}"
E -> return I;
| if "(" B ")" "{" E "}"
| if "(" B ")" "{" E "}" else "{" E "}"
I -> [0-9]+
B -> I < I
| I <= I
| I == I
| I >= I
| I > I
| ! B
| "(" B ")"
Example
C code:
int main() { if (1 < 2) { if (4 > 10) { return 1; } else { return 2; } } return 0; }
Assembly generated:
.text .global main main: mov r0, #1 mov r1, #2 cmp r0, r1 bge if_else_0 mov r0, #4 mov r1, #10 cmp r0, r1 ble if_else_1 mov r0, #1 bx lr if_else_1: mov r0, #2 bx lr if_else_0: mov r0, #0 bx lr