public override void visit(assign_var_tuple assvartup)
        {
            var sl = new List <statement>();

            sl.Add(new semantic_check_sugared_statement_node(assvartup)); // Это нужно для проверок на этапе преобразования в семантику

            var tname = "#temp_var" + UniqueNumStr();
            var tt    = new var_statement(new ident(tname), assvartup.expr); // тут для assvartup.expr внутри повторно вызывается convert_strong, это плохо, но если там лямбда, то иначе - с semantic_addr_value - не работает!!!

            sl.Add(tt);                                                      // он же помещается в новое синтаксическое дерево

            var n = assvartup.vars.variables.Count();

            for (var i = 0; i < n; i++)
            {
                var a = new var_statement(assvartup.vars.variables[i] as ident,
                                          new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString())),
                                          assvartup.vars.variables[i].source_context);
                sl.Add(a);
            }
            ReplaceStatementUsingParent(assvartup, sl);

            visit(assvartup.expr); // В assvartup.expr могут содержаться лямбды, в которых будут другие assign_var_tuple.
            // И вообще другой синтаксический сахар, размещённый в этом визиторе
        }
示例#2
0
        public override void visit(assign_var_tuple assvartup)
        {
            var tname = "#temp_var" + UniqueNumStr();

            if (assvartup.Parent is declarations ds) // А когда это происходит???
            {
                var ld = new List <declaration>();
                ld.Add(new semantic_check_sugared_statement_node(typeof(assign_var_tuple), new List <syntax_tree_node> {
                    assvartup.idents, assvartup.expr
                }, assvartup.source_context));                                                                                                                                          // Это нужно для проверок на этапе преобразования в семантику

                var vd  = new variable_definitions();
                var tt1 = new var_def_statement(new ident(tname, assvartup.expr.source_context), assvartup.expr, assvartup.expr.source_context);
                vd.Add(tt1);

                var nn = assvartup.idents.idents.Count();
                for (var i = 0; i < nn; i++)
                {
                    var a = new var_def_statement(assvartup.idents.idents[i],
                                                  //new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString())),
                                                  new semantic_ith_element_of(new ident(tname, assvartup.expr.source_context), new int32_const(i), assvartup.expr.source_context),
                                                  assvartup.idents.idents[i].source_context);
                    vd.Add(a);
                }
                ld.Add(vd);
                ReplaceAssignVarTupleUsingParent(assvartup, ld);
                visit(assvartup.expr);
                return;
            }

            var sl = new List <statement>();

            sl.Add(new semantic_check_sugared_statement_node(typeof(assign_var_tuple), new List <syntax_tree_node> {
                assvartup.idents, assvartup.expr
            }, assvartup.source_context));                                                                                              // Это нужно для проверок на этапе преобразования в семантику

            var tt = new var_statement(new ident(tname, assvartup.expr.source_context), assvartup.expr, assvartup.expr.source_context); // тут для assvartup.expr внутри повторно вызывается convert_strong, это плохо, но если там лямбда, то иначе - с semantic_addr_value - не работает!!!

            sl.Add(tt);                                                                                                                 // он же помещается в новое синтаксическое дерево

            var n = assvartup.idents.idents.Count();

            for (var i = 0; i < n; i++)
            {
                var sc = assvartup.idents.idents[i].source_context;
                var a  = new var_statement(assvartup.idents.idents[i],
                                           //new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString(),sc)),
                                           new semantic_ith_element_of(new ident(tname, assvartup.expr.source_context), new int32_const(i, sc), assvartup.expr.source_context),
                                           sc);
                //a.source_context = assvartup.idents.idents[i].source_context;
                sl.Add(a);
            }
            ReplaceStatementUsingParent(assvartup, sl);

            visit(assvartup.expr); // В assvartup.expr могут содержаться лямбды, в которых будут другие assign_var_tuple.
            // И вообще другой синтаксический сахар, размещённый в этом визиторе
        }
        public override void visit(assign_var_tuple assvartup)
        {
            _visitor.ProcessNode(assvartup);

            /*foreach (var id in assvartup.idents.idents)
             * {
             *  SymbolInfo si = _visitor.context.find_first(id.name);
             *  _currentTreeNode.VariablesDefinedInScope.Add(new CapturedVariablesTreeNode.CapturedSymbolInfo(assvartup, si));
             * }*/
        }
示例#4
0
        public void ReplaceAssignVarTupleUsingParent(assign_var_tuple from, IEnumerable <declaration> to)
        {
            foreach (var x in to)
            {
                x.Parent = from.Parent;
            }
            var sl = from.Parent as declarations;

            if (sl != null)
            {
                sl.ReplaceInList(from, to);
            }
        }
        public override void visit(assign_var_tuple assvartup)
        {
            if (assvartup.expr is tuple_node tn && tn.el.expressions.All(ex => ex is const_node) && !tn.el.expressions.Any(ex => ex is nil_const))
            {
                var n = assvartup.idents.idents.Count();
                if (n > tn.el.Count)
                {
                    throw new SyntaxVisitorError("TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMENT", assvartup.idents[0]);
                }

                // Оптимизация, т.к. все - константы
                var sl = new List <statement>();
                for (var i = 0; i < n; i++)
                {
                    var a = new var_statement(
                        assvartup.idents.idents[i],
                        tn.el.expressions[i],
                        assvartup.idents.idents[i].source_context);
                    sl.Add(a);
                }
                ReplaceStatementUsingParent(assvartup, sl);
            }
示例#6
0
        public void CreateUnpackedListOfAssignments(unpacked_list_of_ident_or_list ll, List <statement> res, ident prevname, SourceContext sc)
        {
            var idlist = new ident_list();

            foreach (var llelem in ll.lst)
            {
                if (llelem.lst != null)
                {
                    var id = CreateIdent(sc);
                    // надо у этого id установить souce_context
                    idlist.Add(id);
                    CreateUnpackedListOfAssignments(llelem.lst, res, id, sc);
                }
                else
                {
                    idlist.Add(llelem.id);
                }
            }
            idlist.source_context = sc;
            var ass = new assign_var_tuple(idlist, prevname, sc);

            res.Insert(0, ass);
        }
示例#7
0
 public virtual void visit(assign_var_tuple _assign_var_tuple)
 {
     DefaultVisit(_assign_var_tuple);
 }
 public override void visit(assign_var_tuple at)
 {
     UnpackingAssign++;
     base.visit(at);
 }