private static Boolean TryParseAdr(OperandLexer lexer, out IAdrCodeGenerator adr) { Token token = lexer.CurrentToken; if (token.Type == TokenType.DecimalConstant) { lexer.MoveNext(); adr = new DecimalConstant(token.I32Value); return(true); } else if (token.Type == TokenType.HexaDecimalConstant) { lexer.MoveNext(); adr = new HexaDecimalConstant(token.I32Value); return(true); } else if (token.Type == TokenType.Label) { lexer.MoveNext(); adr = new AddressConstant(token.StrValue); return(true); } else if (token.Type == TokenType.EqualSign) { // リテラルは、一つの 10 進定数、16 進定数又は文字定数の前に等号 (=) を付けて記述する。 lexer.MoveNext(); adr = Literal.Parse(lexer); return(true); } else { adr = null; return(false); } }
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); } }