private ParsedOperand ParsePtrOperand(PrimitiveType width) { Expect(Token.PTR); ParsedOperand op = ParseOperand(); op.Operand.Width = width; return(op); }
public ParsedOperand [] ParseOperandList(int min, int max) { OperandParser opp = asm.CreateOperandParser(lexer); List <ParsedOperand> ops = new List <ParsedOperand>(); asm.SegmentOverride = RegisterStorage.None; asm.AddressWidth = asm.SegmentAddressWidth; if (lexer.PeekToken() != Token.EOL) { ops.Add(opp.ParseOperand()); if (opp.SegmentOverride != RegisterStorage.None) { asm.SegmentOverride = opp.SegmentOverride; } if (opp.AddressWidth != null) { asm.AddressWidth = opp.AddressWidth; } while (lexer.PeekToken() == Token.COMMA) { lexer.DiscardToken(); opp.DataWidth = ops[0].Operand.Width; ops.Add(opp.ParseOperand()); if (opp.SegmentOverride != RegisterStorage.None) { if (asm.SegmentOverride != RegisterStorage.None) { Error("Can't have two segment overrides in one instruction"); } asm.SegmentOverride = opp.SegmentOverride; } if (opp.AddressWidth != null) { asm.AddressWidth = opp.AddressWidth; } } } if (min <= ops.Count && ops.Count <= max) { ParsedOperand [] o = new ParsedOperand[ops.Count]; ops.CopyTo(o); return(o); } else { if (min == max) { Error(string.Format("Instruction expects {0} operand(s).", min)); } else { Error(string.Format("Instruction expects between {0} and {1} operand(s).", min, max)); } return(null); } }