summaryrefslogtreecommitdiff
path: root/grammars/c/grammar.txt
blob: ffe85c382c5d9f3ffa68692a7bda9e230146cc23 (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
KEYWORDS list
    switch volatile case while do else const for if
    struct union typedef void

IDENT regex
    [a-zA-Z_][0-9a-zA-Z_]*

INT regex
    [0-9]+

OP list
    ( ) { } [ ] 
    ; ,
    - + ! % * & / << >> ^ |
    -= += != %= *= &= /= <<= == >>= ^= |=
    && || ++ --
    < <= > >= =
    . -> ? :

############### TYPE PARSING
# A PRIMITIVE_TYPE is the core object that takes up space after dereferencing,
# calling, etc. A normal variable declaration is PRIMITIVE_TYPE (expression)
PRIMITIVE_TYPE nonterm
    struct IDENT
    union IDENT
    struct IDENT AGGREGATE_DECLARATION
    union IDENT AGGREGATE_DECLARATION
    const PRIMITIVE_TYPE
    volatile PRIMITIVE_TYPE
    void
    IDENT

# A TYPE_EXPRESSION is basically an lvalue expression.
TYPE_EXPRESSION nonterm
    IDENT
    TYPE_EXPRESSION [ ]
    TYPE_EXPRESSION [ INT ]
    * TYPE_EXPRESSION
    ( TYPE_EXPRESSION )
    TYPE_EXPRESSION ( )
    TYPE_EXPRESSION ( ARGS )

DECLARATION nonterm
    PRIMITIVE_TYPE TYPE_EXPRESSION

# An ANONYMOUS_TYPE has no name
ANONYMOUS_TYPE nonterm
    PRIMITIVE_TYPE
    ANONYMOUS_TYPE [ ]
    ANONYMOUS_TYPE [ INT ]
    * ANONYMOUS_TYPE
    ( ANONYMOUS_TYPE )
    ANONYMOUS_TYPE ( )
    ANONYMOUS_TYPE ( ARGS )

############### TOP LEVEL
TOP_LEVEL nonterm .start
    TYPEDEF
    FUNCTION

ARGS nonterm
    ANONYMOUS_TYPE
    ANONYMOUS_TYPE , ARGS
    DECLARATION
    DECLARATION , ARGS

FUNCTION nonterm
    DECLARATION ( ) TRUE_BLOCK
    DECLARATION ( ARGS ) TRUE_BLOCK

AGGREGATE_DECLARATION nonterm
    { STMTS }

TYPEDEF nonterm
    typedef PRIMITIVE_TYPE TYPE_EXPRESSION ;

EXPR nonterm
    INT
    IDENT
    EXPR --
    EXPR ++
    EXPR OP EXPR
    EXPR ? EXPR : EXPR

IF nonterm
    if ( EXPR ) BLOCK
    if ( EXPR ) BLOCK else BLOCK

WHILE nonterm
    while ( EXPR ) BLOCK

DO nonterm
    do BLOCK while ( EXPR )

FOR nonterm
    for ( EXPR ; EXPR ; EXPR ) BLOCK

SWITCH nonterm
    switch ( EXPR ) BLOCK

DECLARATION_CHAIN nonterm
    TYPE_EXPRESSION
    TYPE_EXPRESSION , DECLARATION_CHAIN
    TYPE_EXPRESSION = EXPR
    TYPE_EXPRESSION = EXPR , DECLARATION_CHAIN

DECLARATION_STATEMENT nonterm
    PRIMITIVE_TYPE DECLARATION_CHAIN ;

STMT nonterm
    IF
    WHILE
    DO
    FOR
    SWITCH
    # NOTE: it auto-prefers declarations right now
    DECLARATION_STATEMENT       .name DECL_STMT
    EXPR ;

STMTS nonterm
    STMT
    STMT STMTS

TRUE_BLOCK nonterm
    { }
    { STMTS }

BLOCK nonterm
    TRUE_BLOCK
    STMT
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback