blob: bdafa5bcb125ddf1f892426a0f09d348ab1b061b (
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
|
%code requires{
#include "ast.hpp"
extern ast_Top *g_root; // A way of getting the AST out
//! This is to fix problems when generating C++
// We are declaring the functions provided by Flex, so
// that Bison generated code can call them.
int yylex(void);
void yyerror(const char *);
}
// Represents the value associated with any kind of
// AST node.
%union{
const ast_Base *stmnt;
// double number;
std::string *string;
}
%token T_TYPE_SPEC T_TYPE_QUAL T_STRG_SPEC T_IDENTIFIER
%token T_SC T_CMA T_EQ T_LRB T_RRB T_LCB T_RCB
%token T_INT_CONST
%type <stmnt> EXT_DEF EXT_DECLARATION
%type <stmnt> FUNC_DEF PARAMETER_LIST PARAMETER PARAM_DECLARATOR
%type <stmnt> DECLARATION_LIST DECLARATION DECLARATION_SPEC DECLARATION_SPEC_T INIT_DECLARATOR INIT_DECLARATOR_LIST DECLARATOR INITIALIZER
%type <stmnt> COMPOUND_STATEMENT COMPOUND_STATEMENT_2
// %type <number> // T_CONSTANT
%type <string> T_IDENTIFIER //T_OPERATOR
%start ROOT
%%
ROOT : EXT_DEF { ; }
;
// EXTERNAL DEFINITION
EXT_DEF : EXT_DECLARATION { g_root->push($1); }
| EXT_DEF EXT_DECLARATION { g_root->push($2); }
;
EXT_DECLARATION : DECLARATION { $$ = $1; }
| FUNC_DEF { $$ = $1; }
;
// FUNCTION DEFINITION
FUNC_DEF : DECLARATION_SPEC T_IDENTIFIER T_LRB PARAMETER_LIST T_RRB COMPOUND_STATEMENT { $$ = new ast_Function(*$2, $4, $6); }
;
PARAMETER_LIST : %empty { $$ = new ast_ParamList(); }
| PARAMETER { $$ = new ast_ParamList($1); }
| PARAMETER_LIST T_CMA PARAMETER { $$->push($3); }
;
PARAMETER : DECLARATION_SPEC PARAM_DECLARATOR { $$ = $2; }
;
PARAM_DECLARATOR : T_IDENTIFIER { $$ = new ast_Parameter(*$1);}
;
// DECLARATION
DECLARATION_LIST : DECLARATION { $$ = new ast_DeclarationList($1); }
| DECLARATION_LIST DECLARATION { $$->push($2); }
DECLARATION : DECLARATION_SPEC INIT_DECLARATOR_LIST T_SC { $$ = $2; }
;
DECLARATION_SPEC : DECLARATION_SPEC_T { ; }
| DECLARATION_SPEC_T DECLARATION_SPEC { ; }
;
DECLARATION_SPEC_T : T_TYPE_SPEC { ; }
| T_TYPE_QUAL { ; }
| T_STRG_SPEC { ; }
;
INIT_DECLARATOR_LIST : INIT_DECLARATOR { $$ = new ast_VariableDeclaration($1); }
| INIT_DECLARATOR_LIST T_CMA INIT_DECLARATOR { $$->push($3); }
;
INIT_DECLARATOR : DECLARATOR { ; }
| DECLARATOR T_EQ INITIALIZER { ; }
;
DECLARATOR : T_IDENTIFIER {$$ = new ast_Variable(*$1); }
;
INITIALIZER : T_INT_CONST { ; }
;
// STATEMENT
COMPOUND_STATEMENT : T_LCB COMPOUND_STATEMENT_2 { $$ = $2; }
;
COMPOUND_STATEMENT_2 : T_RCB { $$ = new ast_CompoundStatement(); }
| DECLARATION_LIST T_RCB { $$ = new ast_CompoundStatement($1); }
;
%%
ast_Top *g_root; // Definition of variable (to match declaration earlier)
ast_Top *parseAST() {
g_root = new ast_Top;
yyparse();
return g_root;
}
|