%{ #include #include 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(); }