aboutsummaryrefslogtreecommitdiff
path: root/demos/sample-files/gram.g
blob: f9daded6f23deafc63685ed32777788c95b76688 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
-terminal
  TERMINAL NONTERM LEFT RIGHT COLON NOPREC
  PIPE SEMICOL DOT
  IDEN NUM ACTION;
-nonterminal
  S A B C
  Type Prec Prod Preclist Prodlist
  Actionlist Idenlist IorNlist.

-noprec.

S: A B C {};

A: TERMINAL Idenlist SEMICOL NONTERM Idenlist DOT { handle_type(A(1), A(4)) };


B: Preclist { handle_prec(A(0)); }
 | NOPREC DOT { handle_prec(NULL); };

Preclist: Prec SEMICOL Preclist { v = list_new_head(A(2), A(0)); }
        | Prec DOT              { v = A(0); };

Prec: LEFT  IorNlist { v = prec_new(A(1), PRECEDENCE_LEFT_ASSOC); }
    | RIGHT IorNlist { v = prec_new(A(1), PRECEDENCE_RIGHT_ASSOC); };


C: Prodlist { handle_prod(A(0)); };

Prodlist: Prod SEMICOL Prodlist { v = list_new_head(A(2), A(0)); }
        | Prod DOT              { v = A(0); };

Prod: IDEN COLON Actionlist     { v = prod_new(A(0), A(2)); };

Actionlist: Idenlist ACTION PIPE Actionlist { v = list_new_head(A(3), action_new(A(0), A(1))); }
          | Idenlist ACTION                 { v = action_new(A(0), A(1)); };

Idenlist: IDEN Idenlist { v = list_new_head(A(1), ptr_new(A(0))); }
        | IDEN          { v = ptr_new(A(0)); };
IorNlist: IDEN IorNlist { v = list_new_head(A(1), ptr_new(A(0))); }
        | IDEN          { v = ptr_new(A(0)); }
        | NUM IorNlist  { v = list_new_head(A(1), num_new(A(0))); }
        | NUM           { v = num_new(A(0)); }.