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; }