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
|
%{
#include <stdio.h>
#include <string.h>
int yylex();
int yyerror(char *s);
%}
%token LBRACKET RBRACKET NAME
%token INTEGER FLOAT FUNCTION
%define api.value.type {char*}
%%
start:
| start expr { printf("%s", $2); }
expr: LBRACKET FUNCTION start RBRACKET { sprintf($$, "new Funcall(\"%s\", { %s })", $2, $3); }
| LBRACKET namelist RBRACKET { sprintf($$, "new List({ %s })", $2); }
| INTEGER { sprintf($$, "new Integer(%s)", $1); }
| FLOAT { sprintf($$, "new Float(%s)", $1); }
| NAME { sprintf($$, "new Name(\"%s\")", $1); }
;
namelist: { $$ = ""; }
| namelist NAME { sprintf($$, ", new Name(\"%s\")", $1); }
;
%%
int yyerror(char *s) {
printf("Error: %s\n", s);
return 0;
}
int main(int argc, char **argv) {
/* #ifdef YYDEBUG */
/* yydebug = 1; */
/* #endif */
yyparse();
}
|