23 |
#define scanner context->scanner |
#define scanner context->scanner |
24 |
#define PARSE_ERR(loc,txt) yyerror(&loc, context, txt) |
#define PARSE_ERR(loc,txt) yyerror(&loc, context, txt) |
25 |
#define PARSE_WRN(loc,txt) InstrScript_warning(&loc, context, txt) |
#define PARSE_WRN(loc,txt) InstrScript_warning(&loc, context, txt) |
26 |
|
#define PARSE_DROP(loc) context->addPreprocessorComment(loc.first_line, loc.last_line, loc.first_column+1, loc.last_column+1); |
27 |
#define yytnamerr(res,str) InstrScript_tnamerr(res, str) |
#define yytnamerr(res,str) InstrScript_tnamerr(res, str) |
28 |
%} |
%} |
29 |
|
|
53 |
%token CONST_ "keyword 'const'" |
%token CONST_ "keyword 'const'" |
54 |
%token POLYPHONIC "keyword 'polyphonic'" |
%token POLYPHONIC "keyword 'polyphonic'" |
55 |
%token WHILE "keyword 'while'" |
%token WHILE "keyword 'while'" |
56 |
|
%token SYNCHRONIZED "keyword 'synchronized'" |
57 |
%token IF "keyword 'if'" |
%token IF "keyword 'if'" |
58 |
%token ELSE "keyword 'else'" |
%token ELSE "keyword 'else'" |
59 |
%token SELECT "keyword 'select'" |
%token SELECT "keyword 'select'" |
229 |
PARSE_WRN(@2, (String("Variable '") + name + "' declared as string, integer expression assigned though.").c_str()); |
PARSE_WRN(@2, (String("Variable '") + name + "' declared as string, integer expression assigned though.").c_str()); |
230 |
IntExprRef expr = $4; |
IntExprRef expr = $4; |
231 |
if (expr->isConstExpr()) { |
if (expr->isConstExpr()) { |
232 |
const int i = expr->evalInt(); |
const vmint i = expr->evalInt(); |
233 |
IntVariableRef var = new IntVariable(context); |
IntVariableRef var = new IntVariable(context); |
234 |
context->vartable[name] = var; |
context->vartable[name] = var; |
235 |
$$ = new Assignment(var, new IntLiteral(i)); |
$$ = new Assignment(var, new IntLiteral(i)); |
254 |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
255 |
} else { |
} else { |
256 |
IntExprRef expr = $4; |
IntExprRef expr = $4; |
257 |
int size = expr->evalInt(); |
vmint size = expr->evalInt(); |
258 |
if (size <= 0) { |
if (size <= 0) { |
259 |
PARSE_ERR(@4, (String("Array variable '") + name + "' declared with array size " + ToString(size) + ".").c_str()); |
PARSE_ERR(@4, (String("Array variable '") + name + "' declared with array size " + ToString(size) + ".").c_str()); |
260 |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
278 |
} else { |
} else { |
279 |
IntExprRef sizeExpr = $4; |
IntExprRef sizeExpr = $4; |
280 |
ArgsRef args = $8; |
ArgsRef args = $8; |
281 |
int size = sizeExpr->evalInt(); |
vmint size = sizeExpr->evalInt(); |
282 |
if (size <= 0) { |
if (size <= 0) { |
283 |
PARSE_ERR(@4, (String("Array variable '") + name + "' must be declared with positive array size.").c_str()); |
PARSE_ERR(@4, (String("Array variable '") + name + "' must be declared with positive array size.").c_str()); |
284 |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
290 |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
291 |
} else { |
} else { |
292 |
bool argsOK = true; |
bool argsOK = true; |
293 |
for (int i = 0; i < args->argsCount(); ++i) { |
for (vmint i = 0; i < args->argsCount(); ++i) { |
294 |
if (args->arg(i)->exprType() != INT_EXPR) { |
if (args->arg(i)->exprType() != INT_EXPR) { |
295 |
PARSE_ERR( |
PARSE_ERR( |
296 |
@8, |
@8, |
324 |
} else { |
} else { |
325 |
IntExprRef sizeExpr = $5; |
IntExprRef sizeExpr = $5; |
326 |
ArgsRef args = $9; |
ArgsRef args = $9; |
327 |
int size = sizeExpr->evalInt(); |
vmint size = sizeExpr->evalInt(); |
328 |
if (size <= 0) { |
if (size <= 0) { |
329 |
PARSE_ERR(@5, (String("Array variable '") + name + "' must be declared with positive array size.").c_str()); |
PARSE_ERR(@5, (String("Array variable '") + name + "' must be declared with positive array size.").c_str()); |
330 |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
336 |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
$$ = new FunctionCall("nothing", new Args, NULL); // whatever |
337 |
} else { |
} else { |
338 |
bool argsOK = true; |
bool argsOK = true; |
339 |
for (int i = 0; i < args->argsCount(); ++i) { |
for (vmint i = 0; i < args->argsCount(); ++i) { |
340 |
if (args->arg(i)->exprType() != INT_EXPR) { |
if (args->arg(i)->exprType() != INT_EXPR) { |
341 |
PARSE_ERR( |
PARSE_ERR( |
342 |
@9, |
@9, |
384 |
} else { |
} else { |
385 |
if (name[0] == '@') |
if (name[0] == '@') |
386 |
PARSE_WRN(@5, "Variable declared as string, integer expression assigned though."); |
PARSE_WRN(@5, "Variable declared as string, integer expression assigned though."); |
387 |
int i = 0; |
vmint i = 0; |
388 |
IntExprRef expr = $5; |
IntExprRef expr = $5; |
389 |
if (expr->isConstExpr()) |
if (expr->isConstExpr()) |
390 |
i = expr->evalInt(); |
i = expr->evalInt(); |
407 |
$$ = new While(new IntLiteral(0), $5); |
$$ = new While(new IntLiteral(0), $5); |
408 |
} |
} |
409 |
} |
} |
410 |
|
| SYNCHRONIZED opt_statements END SYNCHRONIZED { |
411 |
|
$$ = new SyncBlock($2); |
412 |
|
} |
413 |
| IF '(' expr ')' opt_statements ELSE opt_statements END IF { |
| IF '(' expr ')' opt_statements ELSE opt_statements END IF { |
414 |
$$ = new If($3, $5, $7); |
$$ = new If($3, $5, $7); |
415 |
} |
} |
475 |
} else if (!fn) { |
} else if (!fn) { |
476 |
PARSE_ERR(@1, (String("No built-in function with name '") + name + "'.").c_str()); |
PARSE_ERR(@1, (String("No built-in function with name '") + name + "'.").c_str()); |
477 |
$$ = new FunctionCall(name, args, NULL); |
$$ = new FunctionCall(name, args, NULL); |
478 |
|
} else if (context->functionProvider->isFunctionDisabled(fn,context)) { |
479 |
|
PARSE_DROP(@$); |
480 |
|
$$ = new NoFunctionCall; |
481 |
} else if (args->argsCount() < fn->minRequiredArgs()) { |
} else if (args->argsCount() < fn->minRequiredArgs()) { |
482 |
PARSE_ERR(@3, (String("Built-in function '") + name + "' requires at least " + ToString(fn->minRequiredArgs()) + " arguments.").c_str()); |
PARSE_ERR(@3, (String("Built-in function '") + name + "' requires at least " + ToString(fn->minRequiredArgs()) + " arguments.").c_str()); |
483 |
$$ = new FunctionCall(name, args, NULL); |
$$ = new FunctionCall(name, args, NULL); |
486 |
$$ = new FunctionCall(name, args, NULL); |
$$ = new FunctionCall(name, args, NULL); |
487 |
} else { |
} else { |
488 |
bool argsOK = true; |
bool argsOK = true; |
489 |
for (int i = 0; i < args->argsCount(); ++i) { |
for (vmint i = 0; i < args->argsCount(); ++i) { |
490 |
if (args->arg(i)->exprType() != fn->argType(i) && !fn->acceptsArgType(i, args->arg(i)->exprType())) { |
if (args->arg(i)->exprType() != fn->argType(i) && !fn->acceptsArgType(i, args->arg(i)->exprType())) { |
491 |
PARSE_ERR(@3, (String("Argument ") + ToString(i+1) + " of built-in function '" + name + "' expects " + typeStr(fn->argType(i)) + " type, but type " + typeStr(args->arg(i)->exprType()) + " was given instead.").c_str()); |
PARSE_ERR(@3, (String("Argument ") + ToString(i+1) + " of built-in function '" + name + "' expects " + typeStr(fn->argType(i)) + " type, but type " + typeStr(args->arg(i)->exprType()) + " was given instead.").c_str()); |
492 |
argsOK = false; |
argsOK = false; |
511 |
} else if (!fn) { |
} else if (!fn) { |
512 |
PARSE_ERR(@1, (String("No built-in function with name '") + name + "'.").c_str()); |
PARSE_ERR(@1, (String("No built-in function with name '") + name + "'.").c_str()); |
513 |
$$ = new FunctionCall(name, args, NULL); |
$$ = new FunctionCall(name, args, NULL); |
514 |
|
} else if (context->functionProvider->isFunctionDisabled(fn,context)) { |
515 |
|
PARSE_DROP(@$); |
516 |
|
$$ = new NoFunctionCall; |
517 |
} else if (fn->minRequiredArgs() > 0) { |
} else if (fn->minRequiredArgs() > 0) { |
518 |
PARSE_ERR(@3, (String("Built-in function '") + name + "' requires at least " + ToString(fn->minRequiredArgs()) + " arguments.").c_str()); |
PARSE_ERR(@3, (String("Built-in function '") + name + "' requires at least " + ToString(fn->minRequiredArgs()) + " arguments.").c_str()); |
519 |
$$ = new FunctionCall(name, args, NULL); |
$$ = new FunctionCall(name, args, NULL); |
532 |
} else if (!fn) { |
} else if (!fn) { |
533 |
PARSE_ERR(@1, (String("No built-in function with name '") + name + "'.").c_str()); |
PARSE_ERR(@1, (String("No built-in function with name '") + name + "'.").c_str()); |
534 |
$$ = new FunctionCall(name, args, NULL); |
$$ = new FunctionCall(name, args, NULL); |
535 |
|
} else if (context->functionProvider->isFunctionDisabled(fn,context)) { |
536 |
|
PARSE_DROP(@$); |
537 |
|
$$ = new NoFunctionCall; |
538 |
} else if (fn->minRequiredArgs() > 0) { |
} else if (fn->minRequiredArgs() > 0) { |
539 |
PARSE_ERR(@1, (String("Built-in function '") + name + "' requires at least " + ToString(fn->minRequiredArgs()) + " arguments.").c_str()); |
PARSE_ERR(@1, (String("Built-in function '") + name + "' requires at least " + ToString(fn->minRequiredArgs()) + " arguments.").c_str()); |
540 |
$$ = new FunctionCall(name, args, NULL); |
$$ = new FunctionCall(name, args, NULL); |