aboutsummaryrefslogtreecommitdiff
path: root/demos/sample-files/lbp.g
blob: a5532cac2afbda3ecdd625b1ecb8c4e6fa58fddc (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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
-terminal NUM IDEN ATOM
          COMMA SEMICOL DOT COLON
          RPAREN LPAREN RBRACE LBRACE

          TYPELIST_START TYPELIST_END
          T_INT T_ENUM T_STRUCT
          ST_FUNCTION ST_BIG ST_LITTLE ST_NATIVE;

-nonterminal S exprlist expr sym fieldlist basetype subtypelist.

-stacktype { union {
                 struct ast_expr expr;

                 int num;
                 char *str;
                 struct ast_vrbl vrbl;
                 struct strlist strlist;
                 struct list_head *list;

                 struct { int type; char *iden; } basetype;
                 struct { int type; struct list_head *exprlist; } subtype;
             }}.

-left LPAREN;
-left COMMA SEMICOL.

S: exprlist DOT { v = A(0); };

exprlist: expr { v = g_LST(A(0).expr); /* determine type??? */ }
        | expr exprlist { v = g_LST(A(0).expr); v.list->next = A(1).list; }
        | exprlist COMMA exprlist
            { v = g_LST(AST(expr, .type = AST_OPERATION, .operation =
                            AST(oprn, .optype = AST_OP_AND, .left_exprlist = A(0).list, .right_exprlist = A(2).list))); }
        | exprlist SEMICOL exprlist
            { v = g_LST(AST(expr, .type = AST_OPERATION, .operation =
                            AST(oprn, .optype = AST_OP_OR,  .left_exprlist = A(0).list, .right_exprlist = A(2).list)));};

expr: NUM { v = g_AST(expr, .type = AST_NUMBER,   .number = A(0).num); }
    | sym { v = g_AST(expr, .type = AST_VARIABLE, .variable = A(0).vrbl); }
    | sym fieldlist
        { v = g_AST(expr, .type = AST_FIELDLIST, .fieldlist = AST(fiel, .variable = A(0).vrbl, .fields_strlist = A(1).list)); }
    | sym TYPELIST_START basetype TYPELIST_END
        { v = g_AST(expr, .type = AST_DECLARATION, .variable = A(0).vrbl,
                          .datatype = NEW(datatype, .typeflags = A(2).basetype.type,
                                                    .iden = A(2).basetype.iden)); }
    | sym TYPELIST_START basetype subtypelist TYPELIST_END
        { v = g_AST(expr, .type = AST_DECLARATION, .variable = A(0).vrbl,
                          .datatype = NEW(datatype, .typeflags = TYPEFLAGS(A(2).basetype.type, A(3).subtype.type),
                                                    .iden = A(2).basetype.iden,
                                                    .function_exprlist = A(3).subtype.exprlist)); }
    | LBRACE exprlist DOT RBRACE { v = g_AST(expr, .type = AST_BRACELIST, .exprlist = A(1).list); }
    | LPAREN exprlist RPAREN     { v = g_AST(expr, .type = AST_PARENLIST, .exprlist = A(1).list); };

sym: IDEN { v = g_AST(vrbl, .is_atom = 0, .iden = A(0).str); }
   | ATOM { v = g_AST(vrbl, .is_atom = 1, .iden = A(0).str); };

fieldlist: COLON IDEN { v = g_LST(NEW(strlist, .str = A(1).str)); }
         | fieldlist fieldlist { A(0).list->next = A(1).list; v = A(0); };

basetype: T_INT    { v = g_NEW(basetype, .type = DATATYPE_INT); }
        | T_STRUCT { v = g_NEW(basetype, .type = DATATYPE_STRUCT); }
        | T_ENUM   { v = g_NEW(basetype, .type = DATATYPE_ENUM); }
        | T_STRUCT LPAREN ATOM RPAREN { v = g_NEW(basetype, .type = DATATYPE_STRUCT, .iden = A(2).str); }
        | T_ENUM LPAREN ATOM RPAREN   { v = g_NEW(basetype, .type = DATATYPE_ENUM,   .iden = A(2).str); };
subtypelist: ST_FUNCTION LPAREN exprlist RPAREN { v = g_NEW(subtype, .type = SUBTYPE_FUNCTION, .exprlist = A(2).list); }
           | ST_BIG    { v = g_NEW(subtype, .type = SUBTYPE_BIG); }
           | ST_LITTLE { v = g_NEW(subtype, .type = SUBTYPE_LITTLE); }
           | ST_NATIVE { v = g_NEW(subtype, .type = SUBTYPE_NATIVE); }
           | subtypelist subtypelist { v = A(1); v.subtype.type |= A(0).subtype.type; if(A(0).subtype.exprlist) v.subtype.exprlist = A(0).subtype.exprlist; }.