-
Notifications
You must be signed in to change notification settings - Fork 0
/
Parser.y
102 lines (86 loc) · 1.53 KB
/
Parser.y
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
%{
# include <stdio.h>
# include "Syntax.h"
# include "Parser.h"
# include "Lexer.h"
int yyerror(pt_node **node, yyscan_t scanner, const char *msg) {
fprintf(stderr, "Error : %s.\n", msg);
return 0;
}
%}
%code requires {
# ifndef YY_TYPEDEF_YY_SCANNER_T
# define YY_TYPEDEF_YY_SCANNER_T
typedef void *yyscan_t;
# endif
}
%output "Parser.c"
%defines "Parser.h"
%define api.pure
%lex-param { yyscan_t scanner }
%parse-param { pt_node **node }
%parse-param { yyscan_t scanner }
%union {
int boolean;
long integer;
double decimal;
char *string;
pt_node *node;
}
%token TOKEN_NULL
%token TOKEN_LPAREN
%token TOKEN_RPAREN
%token TOKEN_LAMBDA
%type <node> expression
%type <node> expression_list
%token <string> TOKEN_IDENT
%token <string> TOKEN_STRING
%token <decimal> TOKEN_FLOAT
%token <integer> TOKEN_INTEGER
%token <boolean> TOKEN_BOOLEAN
%%
compilationUnit
: expression_list {
*node = $1;
}
;
expression
: TOKEN_LPAREN expression_list TOKEN_RPAREN {
$$ = createExpr();
$$->child = $2;
}
| TOKEN_LPAREN TOKEN_LAMBDA expression_list TOKEN_RPAREN {
$$ = createExpr();
$$->type = PT_LAMBDA;
$$->child = $3;
}
| TOKEN_BOOLEAN {
$$ = createBoolean($1);
}
| TOKEN_INTEGER {
$$ = createInteger($1);
}
| TOKEN_FLOAT {
$$ = createDecimal($1);
}
| TOKEN_STRING {
$$ = createString($1);
}
| TOKEN_IDENT {
$$ = createIdent($1);
}
;
expression_list
: expression_list expression {
$$ = $1;
$1->last->next = $2;
$1->last = $2;
$1->count++;
}
| expression {
$$ = $1;
$1->last = $1;
$1->count = 1;
}
;
%%