/[svn]/linuxsampler/trunk/src/scriptvm/parser.y
ViewVC logotype

Diff of /linuxsampler/trunk/src/scriptvm/parser.y

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3259 by schoenebeck, Wed May 31 14:41:04 2017 UTC revision 3557 by schoenebeck, Sun Aug 18 00:06:04 2019 UTC
# Line 23  Line 23 
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    
# Line 52  Line 53 
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'"
# Line 227  statement: Line 229  statement:
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));
# Line 252  statement: Line 254  statement:
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
# Line 276  statement: Line 278  statement:
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
# Line 288  statement: Line 290  statement:
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,
# Line 322  statement: Line 324  statement:
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
# Line 334  statement: Line 336  statement:
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,
# Line 382  statement: Line 384  statement:
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();
# Line 405  statement: Line 407  statement:
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      }      }
# Line 470  functioncall: Line 475  functioncall:
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);
# Line 478  functioncall: Line 486  functioncall:
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;
# Line 503  functioncall: Line 511  functioncall:
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);
# Line 521  functioncall: Line 532  functioncall:
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);

Legend:
Removed from v.3259  
changed lines
  Added in v.3557

  ViewVC Help
Powered by ViewVC