See Examples
We will use following noations in sections below.
| letter | ::= | a | b | … | z | A | B | … | Z |
| digit | ::= | 0 | 1 | … | 9 |
| id | ::= | letter {letter | digit | _} |
| intconst | ::= | digit {digit} |
| stringconst | ::= | "{any printable ASCII character}" |
Comments are as in C, either a sequence started by / ∗ and ended by ∗ / or a line started by //
| prog | : | {funcdecl} {structdecl} {func} |
| funcdecl | : | type [*] id "(" [ vardecl {","vardecl}[",…"]] ");" |
| structdecl | : | struct id "{" {vardecl";"} "}" |
| type | : | char | int | void | struct id |
| vardecl | : | type [*] id |
| func | : | type [*] id "(" [ vardecl {","vardecl}] ")" block |
| block | : | "{" {vardecl";"} {stmt} "}" |
| stmt | : | if "(" expr ")" stmt else stmt |
| | | while "(" expr ")" stmt | |
| | | for "(" assign";"expr";"assign")" stmt | |
| | | return [ expr ]";" | |
| | | assign";" | |
| | | expr";" | |
| | | block | |
| | | ";" | |
| assign | : | lval "=" expr |
| lval | : | id | "*"id | id"."id | id"->"id | id"["intconst"]" |
| expr | : | "-" expr |
| | | "!" expr | |
| | | id "(" [ expr {","expr}] ");" | |
| | | expr binop expr | |
| | | expr relop expr | |
| | | expr logicop expr | |
| | | lval | |
| | | intconst | stringconst | |
| binop | : | + | - | * | / |
| relop | : | >= | > | < | <= | != | == |
| logicop | : |
&& | || |
TODO
TODO
// I'm comment /* We are comments too! */ // func decls int printf(char * format, ...); void* malloc(int size); // struct decls struct listnode { int val; struct listnode * next; } //funcs int main() { int i; int k; struct listnode * head; struct listnode * prev; prev = NULL; i=5; for(k=0;k<i;k=k+1) { head=malloc(8); head->val = k; head->next= prev; prev = head; } return head; }