コード例 #1
0
        private static Int32 GetAbsValue(ReadBuffer buffer)
        {
            const Int32 Base = 10;

            Char c = buffer.Current;

            if (!CharUtils.IsHankakuDigit(c))
            {
                String message = String.Format(Resources.MSG_InvalidCharForDecimalConstant, c);
                throw new Casl2SimulatorException(message);
            }

            Int32 absValue = CharUtils.ToDigit(c, Base);

            buffer.MoveNext();

            for ( ; ;)
            {
                c = buffer.Current;
                if (!CharUtils.IsHankakuDigit(c))
                {
                    return(absValue);
                }

                Int32 digit = CharUtils.ToDigit(c, Base);
                absValue = absValue * Base + digit;
                buffer.MoveNext();
            }
        }
コード例 #2
0
        private static Char?ReadChar(ReadBuffer buffer)
        {
            Char?result;

            if (buffer.Current != Casl2Defs.SingleQuote)
            {
                // 文字定数を囲むシングルクォートの内側。その文字が結果で、次の文字に進む。
                result = buffer.Current;
                buffer.MoveNext();
            }
            else
            {
                // シングルクォート、シングルクォートが 2 個続いているかどうか調べる。
                buffer.MoveNext();
                if (buffer.Current != Casl2Defs.SingleQuote)
                {
                    // シングルクォートが 2 個続いていなければ、閉じ側のシングルクォート。
                    result = null;
                }
                else
                {
                    // シングルクォートが 2 個続いていれば、シングルクォート 1 つで、次の文字に進む。
                    result = Casl2Defs.SingleQuote;
                    buffer.MoveNext();
                }
            }

            return(result);
        }
コード例 #3
0
        private Token ReadNext()
        {
            Char firstChar = m_buffer.Current;

            if (ProgramLine.EndOfField(firstChar))
            {
                return(Token.MakeEndOfToken());
            }
            else if (firstChar == Casl2Defs.Comma)
            {
                m_buffer.MoveNext();
                return(Token.MakeComma());
            }
            else if (firstChar == Casl2Defs.EqualSign)
            {
                m_buffer.MoveNext();
                return(Token.MakeEqualSign());
            }
            else if (DecimalConstant.IsStart(firstChar))
            {
                Int32 i32Value = DecimalConstant.Read(m_buffer);
                return(Token.MakeDecimalConstant(i32Value));
            }
            else if (HexaDecimalConstant.IsStart(firstChar))
            {
                Int32 i32Value = HexaDecimalConstant.Read(m_buffer);
                return(Token.MakeHexaDecimalConstant(i32Value));
            }
            else if (StringConstant.IsStart(firstChar))
            {
                String strValue = StringConstant.Read(m_buffer);
                return(Token.MakeStringConstant(strValue));
            }
            else if (Label.IsStart(firstChar))
            {
                // ラベルはレジスタ名の場合もある。オペランドの字句要素の区切りまで読み込む。
                String strValue = Operand.ReadItem(m_buffer);
                if (ProgramRegister.IsRegisterName(strValue))
                {
                    return(Token.MakeRegisterName(strValue));
                }
                else
                {
                    return(Token.MakeLabel(strValue));
                }
            }
            else
            {
                String message = String.Format(Resources.MSG_CouldNotParseAsToken, firstChar);
                throw new Casl2SimulatorException(message);
            }
        }
コード例 #4
0
 private static Int32 GetSign(ReadBuffer buffer)
 {
     if (buffer.Current != Casl2Defs.Minus)
     {
         return(1);
     }
     else
     {
         buffer.MoveNext();
         return(-1);
     }
 }
コード例 #5
0
        private static Int32 GetValue(ReadBuffer buffer, out Int32 digitCount)
        {
            const Int32 Base = 16;

            Int32 hexValue = 0;

            digitCount = 0;
            for ( ; ;)
            {
                Char c = buffer.Current;
                if (!CharUtils.IsHankakuHexDigit(c))
                {
                    return(hexValue);
                }

                Int32 digit = CharUtils.ToDigit(c, Base);
                hexValue = hexValue * Base + digit;
                buffer.MoveNext();
                ++digitCount;
            }
        }