Beispiel #1
0
        public void Replace(syntax_tree_node from, syntax_tree_node to)
        {
            var upper = UpperNode();

            if (upper == null)
            {
                throw new Exception("У корневого элемента нельзя получить UpperNode");
            }
            upper.ReplaceDescendant(from, to);
        }
Beispiel #2
0
        public override syntax_tree_node BuildTreeInTypeExprMode(string FileName, string Text)
        {
            // LineCorrection = -1 не забыть
            Text = String.Concat("<<type>>", Environment.NewLine, Text);
            localparserhelper = new GPPGParserHelper(Errors, Warnings, FileName);
            // localparser.parsertools.LineCorrection = -1;
            syntax_tree_node root = localparserhelper.Parse(Text);

            return(root as expression);
        }
Beispiel #3
0
        public typecast_node NewAsIsExpr(syntax_tree_node term, op_typecast typecast_op, type_definition simple_or_template_type_reference, LexLocation loc)
        {
            var naie = new typecast_node((addressed_value)term, simple_or_template_type_reference, typecast_op, loc);

            if (!(term is addressed_value))
            {
                parsertools.errors.Add(new bad_operand_type(parsertools.CurrentFileName, term.source_context, naie));
            }
            return(naie);
        }
Beispiel #4
0
 public SyntaxError(string Message, string fileName, PascalABCCompiler.SyntaxTree.SourceContext _source_context, PascalABCCompiler.SyntaxTree.syntax_tree_node _bad_node)
     : base(Message, fileName)
 {
     source_context = _source_context;
     if (source_context != null && source_context.FileName != null)
     {
         base.fileName = source_context.FileName;
     }
     bad_node = _bad_node;
 }
Beispiel #5
0
        public override void Enter(syntax_tree_node st)
        {
            base.Enter(st);
            countNodesVisited++;

            // сокращение обходимых узлов. Как сделать фильтр по тем узлам, которые необходимо обходить? Например, все операторы (без выражений и описаний), все описания (без операторов)
            if (st is assign || st is var_def_statement || st is procedure_call || st is procedure_header || st is expression)
            {
                visitNode = false; // фильтр - куда не заходить
            }
        }
        /*public procedure_definition NewProcDecl(procedure_definition proc_decl_noclass, LexLocation loc)
         * {
         *  (proc_decl_noclass.proc_header as procedure_header).class_keyword = true;
         *  proc_decl_noclass.source_context = loc;
         *              return proc_decl_noclass;
         * }*/
        public case_variants NewCaseItem(syntax_tree_node case_item, LexLocation loc)
        {
            var nci = new case_variants();

            if (case_item is case_variant)
            {
                nci.Add((case_variant)case_item);
            }
            nci.source_context = loc;
            return(nci);
        }
 public override void DefaultVisit(syntax_tree_node node)
 {
     if (node is T)
     {
         foundT = true;
     }
     else
     {
         base.DefaultVisit(node);
     }
 }
        public case_variants AddCaseItem(case_variants case_list, syntax_tree_node case_item, LexLocation loc)
        {
            var nci = case_list;

            if (case_item is case_variant)
            {
                nci.Add((case_variant)case_item);
            }
            nci.source_context = loc;
            return(nci);
        }
Beispiel #9
0
 public ScopeClassDefinition(syntax_tree_node syntaxTreeNode,
                             type_declaration classDeclaration,
                             CapturedVariablesTreeNode correspondingTreeNode,
                             string generatedSubstitutingFieldName = null)
 {
     CorrespondingSyntaxTreeNode     = syntaxTreeNode;
     ClassDeclaration                = classDeclaration;
     _generatedSubstitutingFieldName = generatedSubstitutingFieldName;
     CorrespondingTreeNode           = correspondingTreeNode;
     NestedLambdas = new List <CapturedVariablesTreeNodeLambdaScope>();
 }
Beispiel #10
0
 public override void Enter(syntax_tree_node st)
 {
     base.Enter(st);
     if (!(st is procedure_definition || st is block || st is statement_list ||
           st.GetType() == typeof(case_node) || st.GetType() == typeof(for_node) || st.GetType() == typeof(foreach_stmt) ||
           st.GetType() == typeof(if_node) ||
           st.GetType() == typeof(repeat_node) || st.GetType() == typeof(while_node) ||
           st.GetType() == typeof(with_statement) || st is try_stmt || st.GetType() == typeof(lock_stmt)))
     {
         //visitNode = false;
     }
 }
Beispiel #11
0
 public override void Enter(syntax_tree_node st)
 {
     base.Enter(st);
     if (st is procedure_definition || st is class_definition)
     {
         list.Add(st as declaration);
         if (PrintInfo)
         {
             Console.Write("+: " + st.GetType().Name);
         }
     }
 }
Beispiel #12
0
 public override void Exit(syntax_tree_node st)
 {
     if (st is procedure_definition || st is class_definition)
     {
         if (PrintInfo)
         {
             Console.WriteLine("-: " + st.GetType().Name);
         }
         list.RemoveAt(list.Count - 1);
     }
     base.Exit(st);
 }
Beispiel #13
0
        public syntax_tree_node Convert(syntax_tree_node root)
        {
            // Прошивание ссылками на Parent nodes. Должно идти первым
            // FillParentNodeVisitor расположен в SyntaxTree/tree как базовый визитор, отвечающий за построение дерева
            FillParentNodeVisitor.New.ProcessNode(root);

            // Выносим выражения с лямбдами из заголовка foreach
            StandOutExprWithLambdaInForeachSequenceVisitor.New.ProcessNode(root);

            //--- Обработка синтаксически сахарных узлов

            // loop
            LoopDesugarVisitor.New.ProcessNode(root);

            // tuple_node
            TupleVisitor.New.ProcessNode(root);

            // assign_tuple и assign_var_tuple
            AssignTuplesDesugarVisitor.New.ProcessNode(root);

            // slice_expr и slice_expr_question
            SliceDesugarVisitor.New.ProcessNode(root);

            // question_point_desugar_visitor
            QuestionPointDesugarVisitor.New.ProcessNode(root);

            // double_question_desugar_visitor
            DoubleQuestionDesugarVisitor.New.ProcessNode(root);


            // Всё, связанное с yield
            MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root);
            ProcessYieldCapturedVarsVisitor.New.ProcessNode(root);

#if DEBUG
            /*var cv = CollectLightSymInfoVisitor.New;
             * cv.ProcessNode(root);
             * cv.Output(@"Light1.txt");*/

            /*try
             * {
             *  //root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz4.txt"));
             * }
             * catch
             * {
             *
             * }*/
#endif
            return(root);
        }
Beispiel #14
0
        public T UpperTo <T>() where T : syntax_tree_node
        {
            syntax_tree_node upperNode = null;

            int up = 1;

            do
            {
                upperNode = UpperNode(up);
                ++up;
            }while ((object)upperNode != null && !(upperNode is T));

            return((object)upperNode != null ? upperNode as T : null);
        }
Beispiel #15
0
        public override PascalABCCompiler.SyntaxTree.syntax_tree_node BuildTree(string FileName, string Text, ParseMode ParseMode, List <string> DefinesList = null)
        {
            syntax_tree_node root = null;

            PreBuildTree(FileName);
            switch (ParseMode)
            {
            case ParseMode.Normal:
                root = BuildTreeInNormalMode(FileName, Text, DefinesList);
                break;

            case ParseMode.Expression:
                root = BuildTreeInExprMode(FileName, Text);
                break;

            case ParseMode.TypeAsExpression:
                root = BuildTreeInTypeExprMode(FileName, Text);
                break;

            case ParseMode.Special:
                root = BuildTreeInSpecialMode(FileName, Text);
                break;

            case ParseMode.ForFormatter:
                root = BuildTreeInFormatterMode(FileName, Text);
                break;

            case ParseMode.Statement:
                root = BuildTreeInStatementMode(FileName, Text);
                break;

            default:
                break;
            }

            if (root != null && root is compilation_unit)
            {
                (root as compilation_unit).file_name           = FileName;
                (root as compilation_unit).compiler_directives = CompilerDirectives;
                if (root is unit_module)
                {
                    if ((root as unit_module).unit_name.HeaderKeyword == UnitHeaderKeyword.Library)
                    {
                        (root as compilation_unit).compiler_directives.Add(new compiler_directive(new token_info("apptype"), new token_info("dll")));
                    }
                }
            }

            return(root);
        }
Beispiel #16
0
        public void visit_yield_helper(syntax_tree_node yn)
        {
            procedure_definition pd = null;

            if (MethodsStack.Count > 0)
            {
                pd = MethodsStack.Peek();
            }

            if (pd == null)
            {
                throw new SyntaxVisitorError("ONLY_FUNCTIONS_CAN_CONTAIN_YIELDS", yn.source_context);
            }

            var fh = (pd.proc_header as function_header);

            if (fh == null)
            {
                throw new SyntaxVisitorError("ONLY_FUNCTIONS_CAN_CONTAIN_YIELDS", pd.proc_header.source_context);
            }
            var seqt = fh.return_type as sequence_type;

            if (seqt == null)
            {
                throw new SyntaxVisitorError("YIELD_FUNC_MUST_RETURN_SEQUENCE", fh.source_context);
            }
            if (seqt.elements_type is procedure_header || seqt.elements_type is function_header)
            {
                throw new SyntaxVisitorError("YIELD_FUNC_CANNOT_RETURN_SEQUENCE_OF_ANONYMOUS_DELEGATES", fh.source_context);
            }
            var pars = fh.parameters;

            if (pars != null)
            {
                foreach (var ps in pars.params_list)
                {
                    if (ps.param_kind != parametr_kind.none)
                    {
                        throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_VAR_CONST_PARAMS_MODIFIERS", pars.source_context);
                    }
                    if (ps.inital_value != null)
                    {
                        throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_DEFAULT_PARAMETERS", pars.source_context);
                    }
                }
            }

            HasYields = true;
        }
        private PatternLocation GetLocation(syntax_tree_node node)
        {
            var firstStatement = GetAscendant <statement>(node);

            switch (firstStatement)
            {
            case if_node _: return(PatternLocation.IfCondition);

            case var_statement _: return(PatternLocation.Assign);

            case assign _: return(PatternLocation.Assign);

            default: return(PatternLocation.Unknown);
            }
        }
        public compilation_unit GetCompilationUnitForFormatter(string FileName, string Text, List <Error> Errors, List <CompilerWarning> Warnings)
        {
            syntax_tree_node cu = Compile(FileName, Text, Errors, Warnings, ParseMode.ForFormatter);

            if (cu == null)
            {
                return(null);
            }
            if (cu is compilation_unit)
            {
                return(cu as compilation_unit);
            }
            Errors.Add(new UnexpectedNodeType(FileName, cu.source_context, null));
            return(null);
        }
 public override void Exit(syntax_tree_node st)
 {
     if (st is procedure_definition)
     {
         if (mids.vars.Count > 0)
         {
             d[st as procedure_definition] = new HashSet <string>(mids.vars);
         }
         var fld = new FindLocalDefsVisitor();
         st.visit(fld);
         fld.Print();
         var t = fld.ids.Intersect(mids.vars); // идентификаторы, захваченные из локального контекста
     }
     base.Exit(st);
 }
        public statement GetStatement(string FileName, string Text, List <Error> Errors, List <CompilerWarning> Warnings)
        {
            syntax_tree_node cu = Compile(FileName, Text, Errors, Warnings, ParseMode.Statement);

            if (cu == null)
            {
                return(null);
            }
            if (cu is statement)
            {
                return(cu as statement);
            }
            Errors.Add(new UnexpectedNodeType(FileName, cu.source_context, null));
            return(null);
            //throw new Errors.CompilerInternalError("Parsers.Controller.GetComilationUnit", new Exception("bad node type"));
        }
        public while_node NewWhileStmt(token_info tkWhile, expression expr, token_info opt_tk_do, statement stmt, LexLocation loc)
        {
            var nws = new while_node(expr, stmt, WhileCycleType.While, loc);

            if (opt_tk_do == null)
            {
                file_position    fp      = expr.source_context.end_position;
                syntax_tree_node err_stn = stmt;
                if (err_stn == null)
                {
                    err_stn = expr;
                }
                parsertools.errors.Add(new PABCNETUnexpectedToken(parsertools.CurrentFileName, StringResources.Get("TKDO"), new SourceContext(fp.line_num, fp.column_num + 1, fp.line_num, fp.column_num + 1, 0, 0), err_stn));
            }
            return(nws);
        }
Beispiel #22
0
        public override void DefaultVisit(syntax_tree_node n)
        {
            // Элементы списков - с конца в начало чтобы можно было эти элементы изменять по ходу (удалять/вставлять/заменять один несколькими)
            var Сount = n.subnodes_count;
            var СountWithoutListElements = n.subnodes_without_list_elements_count;

            for (var i = 0; i < СountWithoutListElements; i++)
            {
                ProcessNode(n[i]);
            }

            for (var i = Сount - 1; i >= СountWithoutListElements; i--) // в обратном порядке
            {
                ProcessNode(n[i]);
            }
        }
        public override void Enter(syntax_tree_node st)
        {
            base.Enter(st);
            countNodesVisited++;
            if (st is procedure_definition)
            {
                // пока вложенные процедуры не анализируются, хотя надо
                mids.vars.Clear();
            }

            // сокращение обходимых узлов. Как сделать фильтр по тем узлам, которые необходимо обходить? Например, все операторы (без выражений и описаний), все описания (без операторов)
            if (st is assign || st is var_def_statement || st is procedure_call || st is procedure_header || st is expression)
            {
                visitNode = false;
            }
        }
        public override void visit(index ind)
        {
            var indexCreation =
                new method_call(
                    new dot_node(
                        new ident("SystemIndex", ind.source_context),
                        new ident("Create", ind.source_context),
                        ind.source_context),
                    new expression_list(
                        new List<expression>()
                        {
                            ind.index_expr,
                            new bool_const(ind.inverted, ind.source_context)
                        },
                        ind.source_context),
                    ind.source_context);
            syntax_tree_node mc = null;
            var possibleIndexer = ind.Parent?.Parent;
            if (possibleIndexer != null && possibleIndexer is indexer indexer)
            {
                // Надо подняться до узла indexer и запомнить индекс, под которым данный index входит
                // Идём по Parent - и смотрим, когда Parent = indexer
                // Находим у него expressions и ищем, под каким индексом в нем содержится текущий.
                // Запоминаем это целое число и передаем его последним параметром в Reverse если expressions.Count > 1
                expression_list reverseIndexMethodParams = null;
                if (indexer.indexes.expressions.Count == 1)
                    reverseIndexMethodParams = new expression_list(indexer.dereferencing_value, ind.source_context);
                else
                {
                    var i = indexer.indexes.expressions.FindIndex(x => x == ind);
                    if (i >= 0)
                        reverseIndexMethodParams = new expression_list(new List<expression> { indexer.dereferencing_value, new int32_const(i) }, ind.source_context);
                }

                mc = new method_call(
                        new dot_node(indexCreation, new ident("Reverse", ind.source_context)),
                        reverseIndexMethodParams,
                        ind.source_context);
            }
            else // Это непонятная ветка. Она наступает в частности если индексер не находится на 2 уровня выше, что бывает в случае индекса вида a[1..^1]
            {
                mc = indexCreation;
            }
            //var sug = new sugared_expression(ind, mc, ind.source_context);
            ReplaceUsingParent(ind, mc);
            visit(mc);
        }
        private T GetAscendant <T>(syntax_tree_node node)
            where T : syntax_tree_node
        {
            var current = node.Parent;

            while (current != null)
            {
                if (current is T res)
                {
                    return(res);
                }

                current = current.Parent;
            }

            return(null);
        }
Beispiel #26
0
        public syntax_tree_node Convert(syntax_tree_node root)
        {
            root.visit(new MarkMethodHasYieldAndCheckSomeErrorsVisitor());
            ProcessYieldCapturedVarsVisitor.New.ProcessNode(root);

#if DEBUG
            try
            {
                //root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz1.txt"));
            }
            catch
            {
            }
#endif

            return(root);
        }
 public virtual void Exit(syntax_tree_node st)
 {
     if (st is statement_list)
     {
         off -= 2;
         Println("end");
     }
     else if (st is while_node || st is if_node || st is type_declarations || st is variable_definitions || st is case_variant)
     {
         off -= 2;
     }
     else if (st is class_definition || st is case_node)
     {
         off -= 2;
         Println("end;");
     }
 }
Beispiel #28
0
        public syntax_tree_node BuildTree(string FileName, string Text, ParseMode ParseMode)
        {
            //if (parser == null)
            Reset();

            GPPGParser.current_file_name  = FileName;
            GPPGParser.CompilerDirectives = compilerDirectives;

            Scanner scn = new Scanner();

            scn.SetSource(Text, 0);

            parser.scanner = scn;

            bool b = parser.Parse();

            if (!b)
            {
                // if we can't recognize error :( or brain.dll not loaded
                Errors.ErrorMsg err = new Errors.ErrorMsg(GPPGParser.current_file_name, new SourceContext(0, 0, 0, 0), "PROGRAM_ERROR");
                GPPGParser.errors.Add(err);
            }

            Errors = GPPGParser.errors;

            syntax_tree_node cu = null;

            switch (ParseMode)
            {
            case ParseMode.Normal:
                cu = GPPGParser.CompilationUnit;
                break;

            case ParseMode.Expression:
            case ParseMode.Statement:
                return(null);
            }

            if (cu != null && cu is compilation_unit)
            {
                (cu as compilation_unit).file_name           = FileName;
                (cu as compilation_unit).compiler_directives = CompilerDirectives;
            }
            return(cu);
        }
Beispiel #29
0
 public override void Exit(syntax_tree_node st)
 {
     switch (st)
     {
     case program_module p:
     case procedure_definition pd:
     case formal_parameters fp:
     case statement_list stl:
     case for_node f:
     case foreach_stmt fe:
     case class_definition cd:
     case record_type rt:
     case function_lambda_definition fld:
     //case repeat_node rep:
     case case_node cas:
         Current = Current.Parent;
         break;
     }
 }
Beispiel #30
0
 public override void Enter(syntax_tree_node st)
 {
     if (d.ContainsKey(st.GetType()))
     {
         d[st.GetType()] += 1;
     }
     else
     {
         d[st.GetType()] = 1;
     }
     if (st is expression)
     {
         exprcount++;
     }
     if (st is statement)
     {
         statcount++;
     }
 }
		public virtual void visit(syntax_tree_node _syntax_tree_node)
		{
		}
		public virtual void visit(syntax_tree_node _syntax_tree_node)
		{
			DefaultVisit(_syntax_tree_node);
		}
Beispiel #33
0
		public override void visit(syntax_tree_node _syntax_tree_node)
		{
			executer.visit(_syntax_tree_node);
		}
		public override void visit(syntax_tree_node _syntax_tree_node)
		{
			DefaultVisit(_syntax_tree_node);
			pre_do_visit(_syntax_tree_node);
			post_do_visit(_syntax_tree_node);
		}
		public virtual void pre_do_visit(syntax_tree_node _syntax_tree_node)
		{
		}
		public virtual void DefaultVisit(syntax_tree_node n)
		{
		}