コード例 #1
0
            public expression NewVariable(addressed_value variable, expression var_specifiers, LexLocation loc)
            {
                if (var_specifiers is dot_node)
                {
                    var dn = (dot_node)var_specifiers;
                    dn.left = variable;
                }
                else if (var_specifiers is template_param_list)
                {
                    var tpl = (template_param_list)var_specifiers;
                    ((dot_node)tpl.dereferencing_value).left = variable;
                    parsertools.create_source_context(tpl.dereferencing_value, variable, tpl.dereferencing_value);
                }
                else if (var_specifiers is dereference)
                {
                    ((dereference)var_specifiers).dereferencing_value = variable;
                }
                else if (var_specifiers is ident_with_templateparams)
                {
                    ((ident_with_templateparams)var_specifiers).name = (addressed_value_funcname)variable;
                }

                var_specifiers.source_context = loc;
                return(var_specifiers);
            }
コード例 #2
0
 public addressed_value NewVarReference(get_address var_address, addressed_value variable, LexLocation loc)
 {
     var_address.address_of = variable;
     parsertools.create_source_context(parsertools.NodesStack.Peek(), parsertools.NodesStack.Peek(),
                                       variable);
     return((addressed_value)parsertools.NodesStack.Pop());
 }
コード例 #3
0
 public addressed_value Into(addressed_value x, addressed_value v) // При возникновении новой конструкции в грамматике variable добавить обработку сюда
 {
     if (v.GetType() == typeof(dot_question_node))
     {
         var vv  = v as dot_question_node;
         var res = new dot_question_node(Into(x, vv.left), vv.right, x.source_context);
         return(res);
     }
     else if (v.GetType() == typeof(dot_node))
     {
         var vv  = v as dot_node;
         var res = new dot_node(Into(x, vv.left), vv.right, x.source_context);
         return(res);
     }
     else if (v.GetType() == typeof(indexer))
     {
         var vv  = v as indexer;
         var res = new indexer(Into(x, vv.dereferencing_value), vv.indexes, x.source_context);
         return(res);
     }
     else if (v.GetType() == typeof(slice_expr))
     {
         var vv  = v as slice_expr;
         var res = new slice_expr(Into(x, vv.dereferencing_value), vv.from, vv.to, vv.step, x.source_context);
         return(res);
     }
     else if (v.GetType() == typeof(slice_expr_question))
     {
         var vv  = v as slice_expr_question;
         var res = new slice_expr_question(Into(x, vv.dereferencing_value), vv.from, vv.to, vv.step, x.source_context);
         return(res);
     }
     else if (v.GetType() == typeof(method_call))
     {
         var vv  = v as method_call;
         var res = new method_call(Into(x, vv.dereferencing_value), vv.parameters, x.source_context);
         return(res);
     }
     else if (v.GetType() == typeof(roof_dereference))
     {
         var vv  = v as roof_dereference;
         var res = new roof_dereference(Into(x, vv.dereferencing_value), x.source_context);
         return(res);
     }
     else if (v.GetType() == typeof(ident_with_templateparams))
     {
         var vv  = v as ident_with_templateparams;
         var res = new ident_with_templateparams(Into(x, vv.name), vv.template_params, x.source_context);
         return(res);
     }
     else
     {
         var res = new dot_node(x, v, x.source_context);
         return(res);
     }
 }
コード例 #4
0
        private expression GetCollectionItemsEqualCheckAfterGap(addressed_value matchingExpression,
                                                                List <pattern_parameter> toCompare,
                                                                CollectionDesugaringResult desugaringResult)
        {
            var        elemFromTail = 1;
            expression equalChecks  = null;

            foreach (var param in toCompare)
            {
                var indexerCall = new indexer(
                    matchingExpression,
                    new expression_list(
                        new bin_expr(
                            new method_call(
                                new dot_node(
                                    matchingExpression,
                                    new ident("Count", matchingExpression.source_context)),
                                new expression_list()),
                            new int32_const(elemFromTail, matchingExpression.source_context),
                            Operators.Minus),
                        matchingExpression.source_context),
                    matchingExpression.source_context);

                if (param is const_pattern_parameter constParam)
                {
                    var eqParams = new expression_list(
                        new List <expression>()
                    {
                        indexerCall,
                        constParam.const_param
                    }
                        );

                    var equalCall = new method_call(
                        new dot_node(
                            new ident("object"),
                            new ident("Equals")),
                        eqParams,
                        matchingExpression.source_context
                        );

                    equalChecks = equalChecks == null ? (expression)equalCall : bin_expr.LogicalAnd(equalChecks, equalCall);
                    desugaringResult.ElemTypeChecks.Add(GetTypeCompatibilityCheck(indexerCall, constParam.const_param));
                }

                if (param is collection_pattern_var_parameter varParam)
                {
                    desugaringResult.VarParametersDeclarations.Add(
                        new var_statement(varParam.identifier, indexerCall));
                }

                ++elemFromTail;
            }
            return(equalChecks);
        }
コード例 #5
0
        /*public question_colon_expression ConvertToQCE1(dot_question_node dqn)
         * {
         *  addressed_value left = dqn.left;
         *  addressed_value right = dqn.right;
         *
         *  var eq = new bin_expr(left, new nil_const(), Operators.Equal, left.source_context);
         *
         *  var nr = Into(left, right);
         *
         *  var q = new question_colon_expression(eq, new nil_const(), nr, dqn.source_context);
         *  nr.Parent = q;
         *  return q;
         * }*/

        public question_colon_expression ConvertToQCE1(dot_question_node dqn, string name)
        {
            addressed_value right = dqn.right;

            var eq = new bin_expr(new ident(name), new nil_const(), Operators.Equal, dqn.left.source_context);

            var nr = Into(new ident(name), right);

            var q = new question_colon_expression(eq, new nil_const(), nr, dqn.source_context);

            nr.Parent = q;
            return(q);
        }
コード例 #6
0
        private expression GetCollectionItemsEqualCheckBeforeGap(addressed_value matchingExpression,
                                                                 List <pattern_parameter> toCompare,
                                                                 CollectionDesugaringResult desugaringResult)
        {
            var        fromIndex   = 0;
            expression equalChecks = null;

            foreach (var param in toCompare)
            {
                if (param is const_pattern_parameter constParam)
                {
                    var indexerCall = new indexer(
                        matchingExpression,
                        new expression_list(
                            new int32_const(fromIndex, matchingExpression.source_context),
                            matchingExpression.source_context),
                        matchingExpression.source_context);

                    var eqParams = new expression_list(
                        new List <expression>()
                    {
                        indexerCall,
                        constParam.const_param
                    }
                        );

                    var equalCall = new method_call(
                        new dot_node(
                            new ident("object"),
                            new ident("Equals")),
                        eqParams,
                        matchingExpression.source_context
                        );

                    equalChecks = equalChecks == null ? (expression)equalCall : bin_expr.LogicalAnd(equalChecks, equalCall);
                    desugaringResult.ElemTypeChecks.Add(GetTypeCompatibilityCheck(indexerCall, constParam.const_param));
                }

                if (param is collection_pattern_var_parameter varParam)
                {
                    desugaringResult.VarParametersDeclarations.Add(
                        new var_statement(varParam.identifier,
                                          GetIndexerCallForCollectionPattern(matchingExpression as addressed_value, fromIndex)));
                }
                ++fromIndex;
            }
            return(equalChecks);
        }
コード例 #7
0
        public question_colon_expression ConvertToQCE(dot_question_node dqn)
        {
            addressed_value left  = dqn.left;
            addressed_value right = dqn.right;

            var             eq     = new bin_expr(left, new nil_const(), Operators.Equal, left.source_context);
            addressed_value dn     = null;
            var             dnleft = right; // Левая часть dn
            addressed_value rdqn   = null;
            addressed_value ldqn   = null;

            // Если right - это dot_question_node, то протащить внутрь него left. В силу ассоциирования слева направо достаточно на первый уровень.
            if (right.GetType() == typeof(dot_question_node))
            {
                var dqn_int = right as dot_question_node;
                ldqn   = dqn_int.left;
                dnleft = ldqn;
                rdqn   = dqn_int.right;
                // необходимо left протащить внутрь в ldqn
            }

            // Пока right - это dot_node, то необходимо протаскивать left чтобы присоединить его к первому не dot_node
            while (dnleft.GetType() == typeof(dot_node))
            {
                dn     = dnleft;
                dnleft = (dnleft as dot_node).left;
            }
            // В итоге в dnleft - самый внутренний left, который уже не является dot_node
            dnleft = new dot_node(left, dnleft, left.source_context); // Прикрепили right к самому внутреннему левому узлу в нотации a.b.c.d
            if (dn != null)
            {
                (dn as dot_node).left = dnleft;
            }
            else if (rdqn == null)
            {
                right = dnleft;
            }
            else
            {
                right = new dot_question_node(dnleft, (right as dot_question_node).right, dnleft.source_context);
            }

            var q = new question_colon_expression(eq, new nil_const(), right, dqn.source_context);

            right.Parent = q;
            return(q);
        }
コード例 #8
0
		public override void visit(addressed_value _addressed_value)
		{
			DefaultVisit(_addressed_value);
			pre_do_visit(_addressed_value);
			post_do_visit(_addressed_value);
		}
コード例 #9
0
		public virtual void post_do_visit(addressed_value _addressed_value)
		{
		}
コード例 #10
0
 public virtual void visit(addressed_value _addressed_value)
 {
 }
コード例 #11
0
		public virtual void visit(addressed_value _addressed_value)
		{
		}
コード例 #12
0
		public virtual void visit(addressed_value _addressed_value)
		{
			DefaultVisit(_addressed_value);
		}
コード例 #13
0
 public addressed_expression visit(addressed_value av)
 {
     av.visit(syntax_tree_visitor);
     return(ret_semantic as addressed_expression);
 }
コード例 #14
0
        private expression GetIndexerCallForCollectionPattern(addressed_value matchingExpression, int ind)
        {
            var indexerCall = new indexer(matchingExpression, new int32_const(ind), matchingExpression.source_context);

            return(indexerCall);
        }
コード例 #15
0
		public override void visit(addressed_value _addressed_value)
		{
			executer.visit(_addressed_value);
			if (_addressed_value.attributes != null)
				this.visit((dynamic)_addressed_value.attributes);
		}
コード例 #16
0
 public virtual void visit(addressed_value _addressed_value)
 {
     DefaultVisit(_addressed_value);
 }
コード例 #17
0
 public override void visit(addressed_value _addressed_value)
 {
 }
コード例 #18
0
 public override void visit(addressed_value _addressed_value)
 {
     throw new NotImplementedException();
 }