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
|