aboutsummaryrefslogtreecommitdiffstats
path: root/c_parser/src/c_parser.y
blob: 9171a1b5a89c8c6327c4e1e189abd55faba1de20 (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
%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 EXT_DECLARATION_2
%type <stmnt> FUNC_DEF
%type <stmnt> DECLARATION DECLARATION_SPEC DECLARATION_SPEC_T INIT_DECLARATOR INIT_DECLARATOR_LIST DECLARATOR INITIALIZER
//                      %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_SPEC EXT_DECLARATION_2 { $$ = $2; }

EXT_DECLARATION_2 : DECLARATION { $$ = $1; }
	|	FUNC_DEF { ; }

// FUNCTION DEFINITION

FUNC_DEF : T_IDENTIFIER T_LRB T_RRB T_LCB T_RCB { ; }

// DECLARATION

DECLARATION : INIT_DECLARATOR_LIST T_SC { $$ = $1; }

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 { ; }

// STATEMENTS

%%

ast_Top *g_root; // Definition of variable (to match declaration earlier)

ast_Top *parseAST() {
    g_root = new ast_Top;
    yyparse();
    return g_root;
}