Specification of Our C Language

See Examples

1 Notation

We will use following noations in sections below.

Alternative
a | b means "a or b"
Optional
[a] means either a or epsilon(empty sequence), so [a] equals to "a | epsilon"
Repetition
{a} means "epsilon | a | aa | aaa | …"

2 Lexical Rule

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 //

3 Syntatic Rule

3.1 Grammar

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 :

&& | ||

3.2 Operator Associativty and Precendence

TODO

4 Typing Rule

TODO

5 Examples

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