示例#1
0
        private char GetStringOctal(int c)
        {
            StringBuilder builder = new StringBuilder();

            builder.Append((char)c);

            if (EcmaChar.IsOctalDigit(this.Reader.Peek()))
            {
                builder.Append((char)this.Reader.Read());
                if (c >= '0' && c <= '3' && EcmaChar.IsOctalDigit(this.Reader.Peek()))
                {
                    builder.Append((char)this.Reader.Read());
                }
            }

            return((char)Convert.ToInt32(builder.ToString(), 8));
        }
示例#2
0
        private TokenBuffer GetString(int stop)
        {
            int           c;
            StringBuilder str = new StringBuilder();

            while (true)
            {
                c = this.Reader.Read();
                if (EcmaChar.IsLineTerminator(c))
                {
                    throw new EcmaRuntimeException("A string cant containe a line terminator. Use \\n instance");
                }

                if (c == stop)
                {
                    return(new TokenBuffer(TokenType.String, str.ToString(), this.LastLineStart));
                }


                if (c == '\\')
                {
                    c = this.Reader.Read();
                    switch (c)
                    {
                    case '\'':
                        str.Append("'");
                        break;

                    case '"':
                        str.Append("\"");
                        break;

                    case '\\':
                        str.Append('\\');
                        break;

                    case 'b':
                        str.Append('\u0008');
                        break;

                    case 't':
                        str.Append('\u0009');
                        break;

                    case 'n':
                        str.Append('\u000A');
                        break;

                    case 'f':
                        str.Append("\u000C");
                        break;

                    case 'r':
                        str.Append('\u000D');
                        break;

                    case 'x':
                        str.Append(GetStringHex());
                        break;

                    case 'u':
                        str.Append(GetStringUnicode());
                        break;

                    default:
                        if (EcmaChar.IsOctalDigit(c))
                        {
                            str.Append(GetStringOctal(c));
                        }
                        str.Append((char)c);
                        break;
                    }
                    continue;
                }

                str.Append((char)c);
            }
        }