public void TestSeek()
        {
            StringStream ss0 = new StringStream("abcdef");

            ss0.Seek(-2, SeekOrigin.End);
            int b = ss0.ReadByte();

            Assert.Equal('e', b);
        }
        public static Property ParsePropertyString(string rawXmlString)
        {
            StringStream stream = new StringStream(rawXmlString);

            stream.Seek(0, SeekOrigin.Begin);
            using (XmlModelParser reader = new XmlModelParser(stream, XmlNodeType.Element, new XmlParserContext(null, null, null, XmlSpace.Default)))
            {
                reader.WhitespaceHandling = WhitespaceHandling.None;
                return(reader.ParseProperty());
            }
        }
Esempio n. 3
0
        public static LogicalLine ParseLine(StringStream stream, ScriptPosition position, EmueraConsole console)
        {
            var lineNo = position.LineNo;
            var errMes = "";

            LexicalAnalyzer.SkipWhiteSpace(stream); //先頭のホワイトスペースを読み飛ばす
            if (stream.EOS)
            {
                return(null);
            }
            //コメント行かどうかはここに来る前に判定しておく
            try
            {
                #region 前置インクリメント、デクリメント行

                if (stream.Current == '+' || stream.Current == '-')
                {
                    var op   = stream.Current;
                    var wc   = LexicalAnalyzer.Analyse(stream, LexEndWith.EoL, LexAnalyzeFlag.None);
                    var opWT = wc.Current as OperatorWord;
                    if (opWT == null || opWT.Code != OperatorCode.Increment && opWT.Code != OperatorCode.Decrement)
                    {
                        if (op == '+')
                        {
                            errMes = "行が\'+\'から始まっていますが、インクリメントではありません";
                        }
                        else
                        {
                            errMes = "行が\'-\'から始まっていますが、デクリメントではありません";
                        }
                        goto err;
                    }
                    wc.ShiftNext();
                    //token = EpressionParser.単語一個分取得(wc)
                    //token非変数
                    //token文字列形
                    //token変更不可能
                    //if (wc != EOS)
                    //
                    return(new InstructionLine(position, FunctionIdentifier.SETFunction, opWT.Code, wc, null));
                }

                #endregion

                var idWT = LexicalAnalyzer.ReadFirstIdentifierWord(stream);
                if (idWT != null)
                {
                    var func = GlobalStatic.IdentifierDictionary.GetFunctionIdentifier(idWT.Code);
                    //命令文
                    if (func != null)   //関数文
                    {
                        if (stream.EOS) //引数の無い関数
                        {
                            return(new InstructionLine(position, func, stream));
                        }
                        if (stream.Current != ';' && stream.Current != ' ' && stream.Current != '\t' &&
                            (!Config.SystemAllowFullSpace || stream.Current != ' '))
                        {
                            if (stream.Current == ' ')
                            {
                                errMes = "命令で行が始まっていますが、命令の直後に半角スペース・タブ以外の文字が来ています(この警告はシステムオプション「" +
                                         Config.GetConfigName(ConfigCode.SystemAllowFullSpace) + "」により無視できます)";
                            }
                            else
                            {
                                errMes = "命令で行が始まっていますが、命令の直後に半角スペース・タブ以外の文字が来ています";
                            }
                            goto err;
                        }
                        stream.ShiftNext();
                        return(new InstructionLine(position, func, stream));
                    }
                }
                LexicalAnalyzer.SkipWhiteSpace(stream);
                if (stream.EOS)
                {
                    errMes = "解釈できない行です";
                    goto err;
                }
                //命令行ではない→代入行のはず
                stream.Seek(0, SeekOrigin.Begin);
                var assignOP = OperatorCode.NULL;
                var wc1      = LexicalAnalyzer.Analyse(stream, LexEndWith.Operator, LexAnalyzeFlag.None);
                //if (idWT != null)
                //	wc1.Collection.Insert(0, idWT);
                try
                {
                    assignOP = LexicalAnalyzer.ReadAssignmentOperator(stream);
                }
                catch (CodeEE)
                {
                    errMes = "解釈できない行です";
                    goto err;
                }
                //eramaker互換警告
                //stream.Jump(-1);
                //if ((stream.Current != ' ') && (stream.Current != '\t'))
                //{
                //	errMes = "変数で行が始まっていますが、演算子の直前に半角スペースまたはタブがありません";
                //	goto err;
                //}
                //stream.ShiftNext();


                if (assignOP == OperatorCode.Equal)
                {
                    if (console != null)
                    {
                        ParserMediator.Warn("代入演算子に\"==\"が使われています", position, 0);
                    }
                    //"=="を代入文に使うのは本当はおかしいが結構使われているので仕様にする
                    assignOP = OperatorCode.Assignment;
                }
                return(new InstructionLine(position, FunctionIdentifier.SETFunction, assignOP, wc1, stream));

err:
                return(new InvalidLine(position, errMes));
            }
            catch (CodeEE e)
            {
                SystemSounds.Hand.Play();
                return(new InvalidLine(position, e.Message));
            }
        }