aboutsummaryrefslogtreecommitdiffstats
path: root/c_parser/src/#c_parser.y#
blob: 75bfeaddb4cf3994cf265729359168275cc8e95c (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
%code requires{

#include "ast.hpp"
extern const Expression *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 Expression *expr;
    double number;
    std::string *string;
}
			
%token	T_KEYWORD T_IDENTIFIER //T_CONSTANT T_OPERATOR T_LCBRACKET T_RCBRACKET
			
%type	<expr> STMNT_LIST STMNT COMP_STMNT EXPR_STMNT SLCT_STMNT ITR_STMNT JMP_STMNT
%type	<number> T_CONSTANT
%type	<string> T_KEYWORD T_IDENTIFIER T_OPERATOR
			
%start ROOT
			
%%

ROOT : STMNT_LIST { g_root = $1; }

STMNT_LIST : STMNT
	| 	STMNT_LIST STMNT

STMNT : COMP_STMNT
	| 	EXPR_STMNT
	| 	SLCT_STMNT
	| 	ITR_STMNT
	|	JMP_STMNT

COMP_STMNT : STMNT_LIST

%%

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

const Expression *parseAST() {
    g_root = 0;
    yyparse();
    return g_root;
}