示例#1
0
        /// <summary>
        /// Parses an assignment or call command
        /// </summary>
        private ICommandNode ParseAssignmentOrCallCommand()
        {
            Debugger.Write("Parsing Assignment Command or Call Command");
            Position       startPosition = CurrentToken.Position;
            IdentifierNode identifier    = ParseIdentifier();

            if (CurrentToken.Type == TokenType.LeftBracket)
            {
                Debugger.Write("Parsing Call Command");
                Accept(TokenType.LeftBracket);
                IParameterNode parameter = ParseParameter();
                Accept(TokenType.RightBracket);
                return(new CallCommandNode(identifier, parameter));
            }
            else if (CurrentToken.Type == TokenType.Becomes)
            {
                Debugger.Write("Parsing Assignment Command");
                Accept(TokenType.Becomes);
                IExpressionNode expression = ParseExpression();
                return(new AssignCommandNode(identifier, expression));
            }
            else
            {
                return(new ErrorNode(startPosition));
            }
        }
示例#2
0
        /// <summary>
        /// Checks that the parameter's <see cref="IDomain"/>s are equivalent.
        /// </summary>
        /// <param name="expected">A <see cref="IParameterNode"/> with expected domain.</param>
        /// <param name="parameter">A <see cref="IParameterNode"/> with the actual domain.</param>
        private static void CheckDomainEquality(IParameterNode expected, IParameterNode parameter)
        {
            Assert.Equal(expected.Domain.GetType(), parameter.Domain.GetType());

            switch (parameter.Domain)
            {
            case CategoricalDomain <string> categoricalDomain:
                Assert.Equal(
                    ((CategoricalDomain <string>)expected.Domain).PossibleValues.ToArray(),
                    categoricalDomain.PossibleValues.ToArray());
                break;

            case NumericalDomain <double> continuousDomain:
                Assert.Equal(
                    ((NumericalDomain <double>)expected.Domain).Minimum,
                    continuousDomain.Minimum);
                Assert.Equal(
                    ((NumericalDomain <double>)expected.Domain).Maximum,
                    continuousDomain.Maximum);
                break;

            case NumericalDomain <int> discreteDomain:
                Assert.Equal(
                    ((NumericalDomain <int>)expected.Domain).Minimum,
                    discreteDomain.Minimum);
                Assert.Equal(
                    ((NumericalDomain <int>)expected.Domain).Maximum,
                    discreteDomain.Maximum);
                break;

            default:
                throw new NotSupportedException(
                          $"All domains should either be categorical strings, continuous or discrete, but {parameter.Identifier}'s domain is of type {parameter.Domain.GetType()}.");
            }
        }
示例#3
0
        //добавление параметра
        public ParamInfo AddParameter(IParameterNode p, ParameterBuilder pb)
        {
            ParamInfo pi = new ParamInfo(pb);

            defs[p] = pi;
            return(pi);
        }
        /// <summary>
        /// Changes the given genome by mutating the gene corresponding to the given <see cref="IParameterNode" />.
        /// </summary>
        /// <param name="genome">The genome to mutate. Will be modified.</param>
        /// <param name="parameterNode">Specification of the parameter / gene to mutate.</param>
        protected void MutateParameter(Genome genome, IParameterNode parameterNode)
        {
            var currentValue = genome.GetGeneValue(parameterNode.Identifier);
            var mutatedValue = parameterNode.Domain.MutateGeneValue(
                currentValue,
                this._mutationVariancePercentage);

            genome.SetGene(parameterNode.Identifier, mutatedValue);
        }
示例#5
0
        //добавление нелок. параметра
        public ParamInfo AddGlobalParameter(IParameterNode p, FieldBuilder fb)
        {
            ParamInfo pi = new ParamInfo();

            pi.kind = ParamKind.pkGlobal;
            pi.fb   = fb;
            defs[p] = pi;
            return(pi);
        }
示例#6
0
        public static Func <TParameter1, object> CreateParameterGetter <TParameter1, TResult>(
            IParameterNode parameter,
            [NotNull] Expression <Func <TParameter1, TResult> > expression)
        {
            var parameters = expression.Parameters;
            var body       = ExpressionCreator.CreateParameterBody(parameter);
            var lambda     = Expression.Lambda <Func <TParameter1, object> >(body, parameters);

            return(lambda.Compile());
        }
示例#7
0
文件: Parser.cs 项目: MSK998/Compiler
        //ParseCallExpression is just an example of the whole expression being parsed
        //it is not actually used due to the PaarseIDExpression

        private IExpressionNode ParseCallExpression()
        {
            Debugger.Write("Parsing call expression");
            IdentifierNode identifier = ParseIdentifier();

            Accept(LeftBracket);
            IParameterNode parameter = ParseParameter();

            Accept(RightBracket);
            return(new CallExpressionNode(identifier, parameter));
        }
        /// <summary>
        /// Parses an ID expression
        /// </summary>
        /// <returns>An abstract syntax tree representing the expression</returns>
        private IExpressionNode ParseIdExpression()
        {
            Debugger.Write("Parsing Identifier Expression");
            IdentifierNode identifier = ParseIdentifier();

            if (CurrentToken.Type == LeftBracket)
            {
                Accept(LeftBracket);
                IParameterNode parameter = ParseParameter();
                Accept(RightBracket);
                return(new IdExpressionNode(identifier, parameter));
            }
            return(new IdExpressionNode(identifier, null));
        }
示例#9
0
        /// <summary>
        /// Parses ID Expression
        /// </summary>
        private IExpressionNode ParseIdExpression()
        {
            Debugger.Write("Parsing Call Expression or Identifier Expression");
            Position       startPosition = CurrentToken.Position;
            IdentifierNode identifier    = ParseIdentifier();

            if (CurrentToken.Type == TokenType.LeftBracket)
            {
                // Parse call expression
                Debugger.Write("Parsing Call Expression");
                Accept(TokenType.LeftBracket);
                IParameterNode parameter = ParseParameter();
                Accept(TokenType.RightBracket);
                return(new CallExpressionNode(identifier, parameter));
            }
            else
            {
                Debugger.Write("Parsing Identifier Expression");
                return(new IdExpressionNode(identifier));
            }
        }
示例#10
0
        /// <summary>
        /// Parses an assignment or call command
        /// <identifier> ( := <expression> | ( <parameter> ) )
        /// </summary>
        /// <returns>An abstract syntax tree representing the command</returns>
        private ICommandNode ParseAssignmentOrCallCommand()
        {
            Debugger.Write("Parsing Assignment Command or Call Command");
            Position       startPosition = CurrentToken.Position;
            IdentifierNode identifier    = ParseIdentifier();

            if (CurrentToken.Type == Becomes) //:= <expression>
            {
                Debugger.Write("Parsing Assignment Command");
                Accept(Becomes);
                IExpressionNode expression = ParseExpression();
                return(new AssignCommandNode(identifier, expression));
            }
            else if (CurrentToken.Type == LeftBracket) //( <parameter> )
            {
                Debugger.Write("Parsing Call Command");
                Accept(LeftBracket);
                IParameterNode parameter = ParseParameter();
                Accept(RightBracket);
                return(new CallCommandNode(identifier, parameter));
            }
            AddToErrorPositions(startPosition, "neither assigment or call command was found");
            return(new ErrorNode(startPosition));
        }
 public virtual void visit(IParameterNode value)
 {
 }
示例#12
0
 public void visit(IParameterNode value)
 {
     throw new System.NotSupportedException(value.GetType().ToString());
 }
示例#13
0
 public IdExpressionNode(IdentifierNode identifier, IParameterNode parameterNode)
 {
     Identifier    = identifier;
     ParameterNode = parameterNode;
 }
示例#14
0
        //получение параметра
		public ParamInfo GetParameter(IParameterNode p)
		{
			return (ParamInfo)defs[p];
		}
示例#15
0
        //добавление нелок. параметра
		public ParamInfo AddGlobalParameter(IParameterNode p, FieldBuilder fb)
		{
			ParamInfo pi = new ParamInfo();
			pi.kind = ParamKind.pkGlobal;
			pi.fb = fb;
			defs[p] = pi;
			return pi;
		}
示例#16
0
        //добавление параметра
		public ParamInfo AddParameter(IParameterNode p, ParameterBuilder pb)
		{
			ParamInfo pi = new ParamInfo(pb);
			defs[p] = pi;
			return pi;
		}
示例#17
0
		private static string get_parameters(IParameterNode[] prms)
		{
			StringBuilder sb = new StringBuilder();
			if (prms.Length > 0)
			{
				sb.Append('(');
				for (int i=0; i<prms.Length; i++)
				{
					IParameterNode prm = prms[i];
					if (prm.parameter_type == parameter_type.var)
						sb.Append(get_span_for_keyword("var")+" ");
					else if (prm.is_params)
						sb.Append(get_span_for_keyword("params")+" ");
					sb.Append(get_span_for_param(prm.name));
					sb.Append(" : ");
					sb.Append(get_type_html_text(prm.type));
					if (i<prms.Length-1)
					sb.Append("; ");
				}
				sb.Append(')');
			}
			return sb.ToString();
		}
 /// <summary>
 /// Checks whether the provided <paramref name="parameter"/> can be considered as continuous.
 /// </summary>
 /// <param name="parameter">The parameter.</param>
 /// <param name="minimumDomainSize">Minimum size of an integer domain to be considered continuous.</param>
 /// <returns>Whether the provided <paramref name="parameter"/> can be considered as continuous.</returns>
 private static bool ParameterIsConsideredContinuous(IParameterNode parameter, int minimumDomainSize)
 {
     return(parameter.Domain is NumericalDomain <double> ||
            (parameter.Domain is NumericalDomain <int> && parameter.Domain.DomainSize >= minimumDomainSize));
 }
示例#19
0
 public void visit(IParameterNode value)
 {
     string s = value.GetType().Name + ".";
     prepare_string_node(value.name, s + "name");
     //value.function
     prepare_node(value.inital_value, s + "initial_value");
     prepare_string_node(value.is_params.ToString(), s + "is_params");
     prepare_string_node(value.node_location_kind.ToString(), s + "node_location_kind");
     prepare_string_node(value.parameter_type.ToString(), s + "parameter_type");
     //value.type 
 }
示例#20
0
 public CallExpressionNode(IdentifierNode identifier, IParameterNode parameter)
 {
     Identifier = identifier;
     Parameter  = parameter;
 }
 /// <summary>
 /// Creates a new call command node
 /// </summary>
 /// <param name="identifier">The function name</param>
 /// <param name="parameter">The function call parameter</param>
 public CallCommandNode(IdentifierNode identifier, IParameterNode parameter)
 {
     Identifier = identifier;
     Parameter  = parameter;
 }
示例#22
0
		public virtual void visit(IParameterNode value)
		{
		}
示例#23
0
 //получение параметра
 public ParamInfo GetParameter(IParameterNode p)
 {
     return((ParamInfo)defs[p]);
 }
示例#24
0
 bool CallCloneIfNeed(ILGenerator il, IParameterNode parameter, IExpressionNode expr)
 {
     TypeInfo ti = helper.GetTypeReference(parameter.type);
     if (ti != null && ti.clone_meth != null && parameter.parameter_type == parameter_type.value && !parameter.is_const &&
         parameter.type.type_special_kind != type_special_kind.base_set_type /*&&
         !(expr is ICompiledConstructorCall) &&
         !(expr is ICommonConstructorCall)*/)
     {
         il.Emit(OpCodes.Call, ti.clone_meth);
         return true;
     }
     return false;
 }