1{
2#include <string.h>
3#include <stdio.h>
4#include <stdlib.h>
5char *xdup(char *s, char *e) {
6  char *ss = malloc( e - s + 2 );
7  memcpy(ss, s, e-s);
8  ss[e-s] = 0;
9  return ss;
10}
11}
12
13translation_unit: statement*;
14
15statement
16  : expression ';'
17  { printf("(%s)expression ;(%s)",
18           xdup(d_ws_before(${parser}, &$n), $n.start_loc.s),
19           xdup($n.end, d_ws_after(${parser}, &$n)));
20  }
21  ;
22
23expression
24  : identifier '=' expression $right 1
25  { printf("(%s)= in expression(%s)",
26           xdup(d_ws_before(${parser}, &$n1), $n1.start_loc.s),
27           xdup($n1.end, d_ws_after(${parser}, &$n1)));
28  }
29  | integer
30  { printf("(%s)expression: integer(%s)",
31           xdup(d_ws_before(${parser}, &$n0), $n0.start_loc.s),
32           xdup($n0.end, d_ws_after(${parser}, &$n0)));
33  }
34  | expression '+' expression $right 2
35  { printf("(%s)+ in expression(%s)",
36           xdup(d_ws_before(${parser}, &$n1), $n1.start_loc.s),
37           xdup($n1.end, d_ws_after(${parser}, &$n1)));
38  }
39  ;
40
41integer: "-?([0-9]|0(x|X))[0-9]*(u|U|b|B|w|W|L|l)*" $term -1;
42identifier: "[a-zA-Z_][a-zA-Z_0-9]*"
43  { printf("(%s)identifier(%s)",
44           xdup(d_ws_before(${parser}, &$n0), $n0.start_loc.s),
45           xdup($n0.end, d_ws_after(${parser}, &$n0)));
46  }
47  ;
48