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(); } }
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); }
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); } }
private static Int32 GetSign(ReadBuffer buffer) { if (buffer.Current != Casl2Defs.Minus) { return(1); } else { buffer.MoveNext(); return(-1); } }
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; } }