version 1.1, 2001/04/29 11:28:24
|
version 1.7, 2007/12/31 19:02:25
|
Line 1
|
Line 1
|
/* front-end compiler for vmgen example |
/* front-end compiler for vmgen example |
|
|
Copyright (C) 2001 Free Software Foundation, Inc. |
Copyright (C) 2001,2002,2003,2007 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Gforth is free software; you can redistribute it and/or |
Gforth is free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License |
modify it under the terms of the GNU General Public License |
as published by the Free Software Foundation; either version 2 |
as published by the Free Software Foundation, either version 3 |
of the License, or (at your option) any later version. |
of the License, or (at your option) any later version. |
|
|
This program is distributed in the hope that it will be useful, |
This program is distributed in the hope that it will be useful, |
Line 15
|
Line 15
|
GNU General Public License for more details. |
GNU General Public License for more details. |
|
|
You should have received a copy of the GNU General Public License |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
along with this program; if not, see http://www.gnu.org/licenses/. |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
*/ |
*/ |
|
|
/* I use yacc/bison here not because I think it's the best tool for |
/* I use yacc/bison here not because I think it's the best tool for |
Line 40 int vm_debug;
|
Line 39 int vm_debug;
|
|
|
void yyerror(char *s) |
void yyerror(char *s) |
{ |
{ |
fprintf (stderr, "%s: %d: %s\n", program_name, yylineno, s); |
#if 1 |
|
/* for pure flex call */ |
|
fprintf(stderr, "%s: %s\n", program_name, s); |
|
#else |
|
/* lex or flex -l supports yylineno */ |
|
fprintf (stderr, "%s: %d: %s\n", program_name, yylineno, s); |
|
#endif |
} |
} |
|
|
#include "mini-gen.i" |
#include "mini-gen.i" |
Line 94 stats: stats stat ';'
|
Line 99 stats: stats stat ';'
|
|
|
stat: IF expr THEN { gen_zbranch(&vmcodep, 0); $<instp>$ = vmcodep; } |
stat: IF expr THEN { gen_zbranch(&vmcodep, 0); $<instp>$ = vmcodep; } |
stats { $<instp>$ = $<instp>4; } |
stats { $<instp>$ = $<instp>4; } |
elsepart END IF { BB_BOUNDARY; $<instp>7[-1] = vmcodep; } |
elsepart END IF { BB_BOUNDARY; $<instp>7[-1] = (Inst)vmcodep; } |
| WHILE { BB_BOUNDARY; $<instp>$ = vmcodep; } |
| WHILE { BB_BOUNDARY; $<instp>$ = vmcodep; } |
expr DO { gen_zbranch(&vmcodep, 0); $<instp>$ = vmcodep; } |
expr DO { gen_zbranch(&vmcodep, 0); $<instp>$ = vmcodep; } |
stats END WHILE { gen_branch(&vmcodep, $<instp>2); $<instp>5[-1] = vmcodep; } |
stats END WHILE { gen_branch(&vmcodep, $<instp>2); $<instp>5[-1] = (Inst)vmcodep; } |
| IDENT BECOMES expr { gen_storelocal(&vmcodep, var_offset($1)); } |
| IDENT BECOMES expr { gen_storelocal(&vmcodep, var_offset($1)); } |
| PRINT expr { gen_print(&vmcodep); } |
| PRINT expr { gen_print(&vmcodep); } |
| expr { gen_drop(&vmcodep); } |
| expr { gen_drop(&vmcodep); } |
; |
; |
|
|
elsepart: ELSE { gen_branch(&vmcodep, 0); $<instp>$ = vmcodep; $<instp>0[-1] = vmcodep; } |
elsepart: ELSE { gen_branch(&vmcodep, 0); $<instp>$ = vmcodep; $<instp>0[-1] = (Inst)vmcodep; } |
stats { $$ = $<instp>2; } |
stats { $$ = $<instp>2; } |
| { $$ = $<instp>0; } |
| { $$ = $<instp>0; } |
; |
; |
Line 126 term: '(' expr ')'
|
Line 131 term: '(' expr ')'
|
| NUM { gen_lit(&vmcodep, $1); } |
| NUM { gen_lit(&vmcodep, $1); } |
; |
; |
|
|
/* missing: argument counting and checking against calling function */ |
/* missing: argument counting and checking against called function */ |
args: expr ',' args |
args: expr ',' args |
| expr |
| expr |
| ; |
| ; |