Ejemplo n.º 1
0
		/// <summary> Adds the specified operator to the respective appendable sets regarding domainKind, associativity and precedence. </summary>
		public static void Add(Notion @operator, DomainKind domainKind, Associativity associativity, Set precedenceSet)
		{
			Contract.Requires(@operator != null);
			Contract.RequiresEnumIsDefined(domainKind);
			Contract.Requires(domainKind != DomainKind.Operand);
			Contract.RequiresEnumIsDefined(associativity);
			Contract.Requires(precedenceSet != null);
			Contract.Requires(ReferenceEquals(precedenceSet.Workspace, @operator.Workspace));
			Contract.Requires(Precedences.Contains(precedenceSet));
			Contract.Requires(AllAppendableSetsRelationToLinearNotions.All(linearAppendableSet => !linearAppendableSet.Contains(@operator)));
			Contract.Requires(precedenceSet.IsAppendable);

			var workspace = @operator.Workspace;
			precedenceSet.Append(@operator);

			switch (domainKind)
			{
				case DomainKind.UnaryPrefix:
					UnaryPreOperators.Append(@operator);
					break;
				case DomainKind.UnaryPostfix:
					UnaryPostOperators.Append(@operator);
					break;
				case DomainKind.Binary:
					BinaryOperators.Append(@operator);
					break;
				case DomainKind.Nullary:
					NullaryOperators.Append(@operator);
					break;
				case DomainKind.Operand:
				default:
					throw new Exception();
			}

			switch (associativity)
			{
				case Associativity.Left:
					LeftAssociativeOperators.Append(@operator);
					break;
				case Associativity.Right:
					RightAssociativeOperators.Append(@operator);
					break;
				case Associativity.Undefined:
					UnassociativeOperators.Append(@operator);
					break;
				case Associativity.Associative:
					AssociativeOperators.Append(@operator);
					break;
				default:
					throw new Exception();
			}
		}