blob: 9fb2be9483ad1bf0dceaba56238db0d4f3aa5a7a (
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
|
%{
#include <stdint.h>
#include <stdio.h>
#include <bu/string.h>
int yylex();
void yyerror( const char *error ) { printf("%s\n", error ); }
%}
%union {
int64_t iValue;
double dValue;
Bu::String *sValue;
bool bValue;
}
%token tokGame
%token tokFunction
%token tokSituation
%token tokWhile
%token tokFor
%token tokEach
%token tokIn
%token tokIf
%token tokThen
%token tokElse
%token tokCommand
%token <sValue> tokSituationName
%token <sValue> tokIdent
%token tokGoto
%token <sValue> tokString
%token <iValue> tokInt
%token <dValue> tokFloat
%token <bValue> tokBool
%token tokNull
%destructor { delete $$; printf("string deleted.\n"); } tokString tokSituationName
%token eos 0 "end of stream"
%left '(' ')' '[' ']'
%left '*' '/'
%left '-' '+'
%%
input: gameDecl bodyDecl
;
gameDecl: tokGame '{' gameExprList '}'
;
gameExprList:
| gameExprList cmpltGameExpr
;
cmpltGameExpr: gameExpr ';'
;
gameExpr: tokIdent '=' expr
;
bodyDecl:
| bodyDecl situation
| bodyDecl function
;
situation: tokSituation tokSituationName { printf("Read situtaion: %s\n", (*$2).getStr() ); } '{' cmpltExprList '}'
;
function: tokFunction tokIdent '(' ')' '{' '}'
;
cmpltExprList:
| cmpltExprList cmpltExpr
;
cmpltExpr: expr ';'
| tokGoto '(' expr ')' ';'
;
expr: tokInt
| tokFloat
| tokString
| tokBool
| tokNull
| tokSituationName
| expr '+' expr
| expr '-' expr
| expr '/' expr
| expr '*' expr
| '(' expr ')'
| expr '[' expr ']'
| '[' ']'
| '[' listValues ']'
| '{' '}'
| '{' dictValues '}'
;
listValues: expr
| listValues ',' expr
;
dictValues: expr ':' expr
| dictValues ',' expr ':' expr
;
%%
int main()
{
yyparse();
return 0;
}
|