private Operand ParseOperand()
{
var t = tokens[pos];
var ptr = false;
var b = false;
if (t.Type == TokenType.Word && t.Value.ToLower() == "byte")
{
b = true;
t = tokens[++pos];
}
if (t.Type == TokenType.OpenBracket)
{
ptr = true;
pos++;
}
try
{
t = tokens[pos++];
switch (t.Type)
{
case TokenType.Word:
{
Registers register;
if (Enum.TryParse(t.Value, true, out register))
{
return Operand.FromRegister(register, ptr, b);
}
else
{
return Operand.FromLabel(t.Value, t.Line, ptr, b);
}
}
case TokenType.BitwiseNot:
case TokenType.OpenParentheses:
case TokenType.Number:
--pos;
return Operand.FromNumber(EvaluateExpression(), ptr, b);
case TokenType.String:
{
var strBytes = Encoding.GetEncoding(437).GetBytes(t.Value);
if (strBytes.Length < 1 || strBytes.Length > 2)
throw new AssemblerException(string.Format("Bad string literal size on line {0}.", t.Line));
return Operand.FromNumber(strBytes.Length == 2 ? BitConverter.ToInt16(strBytes, 0) : (sbyte)strBytes[0], ptr, b);
}
}
throw new AssemblerException(string.Format("Expected operand on line {0}.", t.Line));
}
finally
{
if (ptr)
{
Require(TokenType.CloseBracket);
}
}
}