public override IPExpr VisitFormatedString([NotNull] PParser.FormatedStringContext context) { string baseString = context.StringLiteral().GetText(); baseString = baseString.Substring(1, baseString.Length - 2); // strip beginning / end double quote int numNecessaryArgs = TypeCheckingUtils.PrintStmtNumArgs(baseString); if (numNecessaryArgs == -1) { throw handler.InvalidStringExprFormat(context, context.StringLiteral().Symbol); } List <IPExpr> args = TypeCheckingUtils.VisitRvalueList(context.rvalueList(), this).ToList(); foreach (IPExpr arg in args) { if (arg is LinearAccessRefExpr) { throw handler.StringAssignStmtLinearArgument(arg.SourceLocation); } } if (args.Count != numNecessaryArgs) { throw handler.IncorrectArgumentCount(context, args.Count, numNecessaryArgs); } return(new StringExpr(context, baseString, args)); }
public Exception InvalidStringExprFormat(PParser.FormatedStringContext context, IToken symbol) { return(IssueError(context, symbol, "String expr format placeholders must contain only digits. Escape braces by doubling them.")); }