diff options
author | Eugene Sandulenko | 2016-06-19 04:58:29 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2016-08-03 23:40:36 +0200 |
commit | 76282dc9d75e7a4a3b3a05b4a376a536a1f48ad2 (patch) | |
tree | 3300ac8174e1812cda338911f494cc732a1accbf /engines/director/lingo/lingo-gr.y | |
parent | a5b69ca37d7f493d3d8f9380a4a4d0b78ab16b79 (diff) | |
download | scummvm-rg350-76282dc9d75e7a4a3b3a05b4a376a536a1f48ad2.tar.gz scummvm-rg350-76282dc9d75e7a4a3b3a05b4a376a536a1f48ad2.tar.bz2 scummvm-rg350-76282dc9d75e7a4a3b3a05b4a376a536a1f48ad2.zip |
DIRECTOR: Lingo: Added printing func
Diffstat (limited to 'engines/director/lingo/lingo-gr.y')
-rw-r--r-- | engines/director/lingo/lingo-gr.y | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y index 7d73f6707e..86ae2f1e60 100644 --- a/engines/director/lingo/lingo-gr.y +++ b/engines/director/lingo/lingo-gr.y @@ -36,13 +36,17 @@ using namespace Director; %} -%union { float f; int i; Common::String *s; } +%union { + Common::String *s; + int i; + float f; + int code; +} %token UNARY -%token<f> FLOAT %token<i> INT -%token<s> VAR -%token<s> STRING +%token<f> FLOAT +%token<s> VAR STRING %token OP_INTO %token OP_TO %token FUNC_MCI @@ -50,8 +54,7 @@ using namespace Director; %token FUNC_PUT %token FUNC_SET -%type<i> expr -%type<i> func +%type<code> assign expr %right '=' %left '+' '-' @@ -60,12 +63,20 @@ using namespace Director; %% -list: statement - | list '\n' statement +list: /* empty */ + | list '\n' + | list func '\n' + | list assign '\n' { g_lingo->code2(g_lingo->func_xpop, STOP); return 1; } + | list statement '\n' { g_lingo->code1(STOP); return 1; } + | list expr '\n' { g_lingo->code2(g_lingo->func_printtop, STOP); return 1; } + ; + +assign: FUNC_PUT expr OP_INTO VAR { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($4->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $2; delete $4; } + | FUNC_SET VAR '=' expr { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($2->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $4; delete $2; } + | FUNC_SET VAR OP_TO expr { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($2->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $4; delete $2; } ; -statement: expr - | func +statement: expr { g_lingo->code1(g_lingo->func_xpop); } ; expr: INT { $$ = g_lingo->code2(g_lingo->func_constpush, (inst)$1); } @@ -77,14 +88,10 @@ expr: INT { $$ = g_lingo->code2(g_lingo->func_constpush, (inst)$1); } | '+' expr %prec UNARY { $$ = $2; } | '-' expr %prec UNARY { $$ = $2; g_lingo->code1(g_lingo->func_negate); } | '(' expr ')' { $$ = $2; } - | ; func: FUNC_MCI STRING { g_lingo->code1(g_lingo->func_mci); g_lingo->codeString($2->c_str()); delete $2; } | FUNC_MCIWAIT VAR { g_lingo->code1(g_lingo->func_mciwait); g_lingo->codeString($2->c_str()); delete $2; } - | FUNC_PUT expr OP_INTO VAR { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($4->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $2; delete $4; } - | FUNC_SET VAR '=' expr { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($2->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $4; delete $2; } - | FUNC_SET VAR OP_TO expr { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($2->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $4; delete $2; } ; %% |