Пример #1
0
        public override IPStmt VisitStringAssignStmt(PParser.StringAssignStmtContext context)
        {
            IPExpr variable   = exprVisitor.Visit(context.lvalue());
            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.InvalidStringAssignFormat(context, context.StringLiteral().Symbol);
            }

            List <IPExpr> args = TypeCheckingUtils.VisitRvalueList(context.rvalueList(), exprVisitor).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);
            }

            if (variable.Type != PrimitiveType.String)
            {
                throw handler.TypeMismatch(context, variable.Type, PrimitiveType.String);
            }

            return(new StringAssignStmt(context, variable, baseString, args));
        }
Пример #2
0
 public Exception InvalidStringAssignFormat(PParser.StringAssignStmtContext context, IToken symbol)
 {
     return(IssueError(context,
                       symbol,
                       "String assign format placeholders must contain only digits. Escape braces by doubling them."));
 }