Ejemplo n.º 1
0
        private void BuildReferences(ProcedureDivision procedureDivision)
        {
            // Perform-Referenzen aufbauen
            var allProcedures = procedureDivision.Sections.SelectMany(sec => sec.Procedures).ToList();

            foreach (var procedure in allProcedures)
            {
                foreach (var reference in procedure.PerformReferences)
                {
                    // procedure performs reference. Find referencedProcedure
                    var referencedProcedure = allProcedures.FirstOrDefault(proc => proc.Name == reference.ReferencedProcedure) ??
                                              procedureDivision.Sections.FirstOrDefault(sec => sec.Name == reference.ReferencedProcedure + " SECTION");

                    if (referencedProcedure != null)
                    {
                        reference.Procedure = referencedProcedure;
                        referencedProcedure.IsReferencedBy.Add(new PerformReference(procedure));
                    }
                    else
                    {
                        Console.WriteLine(@"Referenz nicht gefunden: " + reference.ReferencedProcedure);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public static void CheckLibrary([NotNull] ProcedureDivision procedureDivision)
        {
            //A procedure or a function cannot contains another procedure or function declaration
            //So we only need to check ProcedureDivision of Program
            if (!(procedureDivision.Parent is Program))
            {
                return;
            }


            //If the procedure division contains a PUBLIC procedure or function then it's considered as a "Library"
            bool isLibrary = procedureDivision.Children.Any(c =>
            {
                var f = c.CodeElement as FunctionDeclarationHeader;
                return(f != null && f.Visibility == AccessModifier.Public);
            });

            if (isLibrary)
            {
                bool firstParagraphChecked = false;
                foreach (var child in procedureDivision.Children)
                {
                    //TCRFUN_ONLY_PARAGRAPH_AND_PUBLIC_FUNC_IN_LIBRARY
                    if (child is Paragraph)
                    {
                        if (!firstParagraphChecked &&
                            !child.Name.Equals("INIT-LIBRARY", StringComparison.InvariantCultureIgnoreCase))
                        {
                            DiagnosticUtils.AddError(child.CodeElement == null ? procedureDivision : child,
                                                     "First paragraph of a program which contains public procedure must be INIT-LIBRARY. Move paragraph " + child.Name + " lower in the source.");
                        }
                        firstParagraphChecked = true;

                        continue; //A paragraph is always accepted as a child of ProcedureDivision
                    }
                    //TCRFUN_ONLY_PARAGRAPH_AND_PUBLIC_FUNC_IN_LIBRARY
                    if (!(child is FunctionDeclaration || child is Declaratives))
                    {
                        DiagnosticUtils.AddError(child.CodeElement == null ?
                                                 (child is Sentence
                            ? (child.Children.FirstOrDefault(c => c.CodeElement != null) ?? procedureDivision)
                            : procedureDivision) : child,
                                                 "Inside a library only function declaration or declaratives are allowed " + child.Name + " / " + child.ID);
                    }
                }

                var pdiv = procedureDivision.CodeElement as ProcedureDivisionHeader;

                //TCRFUN_LIBRARY_PROCEDURE_NO_USING
                if (pdiv?.UsingParameters != null && pdiv.UsingParameters.Count > 0)
                {
                    DiagnosticUtils.AddError(procedureDivision,
                                             "Illegal " + pdiv.UsingParameters.Count + " USING in library PROCEDURE DIVISION.");
                }
            }
        }
Ejemplo n.º 3
0
        public void OnNode([NotNull] Node node, ParserRuleContext context, CodeModel.Program program)
        {
            ProcedureDivision procedureDivision = node as ProcedureDivision;

            if (procedureDivision == null)
            {
                return; //not our job
            }
            var  pdiv            = procedureDivision.CodeElement as ProcedureDivisionHeader;
            bool isPublicLibrary = false;
            var  elementsInError = new List <CodeElement>();
            var  errorMessages   = new List <string>();

            foreach (var child in procedureDivision.Children)
            {
                if (child.CodeElement == null)
                {
                    elementsInError.Add(procedureDivision.CodeElement);
                    errorMessages.Add("Illegal default section in library. " + child);
                }
                else
                {
                    var function = child.CodeElement as FunctionDeclarationHeader;
                    if (function != null)
                    {
                        isPublicLibrary = isPublicLibrary || function.Visibility == AccessModifier.Public;
                    }
                    else
                    {
                        elementsInError.Add(child.CodeElement);
                        errorMessages.Add("Illegal non-function item in library");
                    }
                }
            }
            if (isPublicLibrary)
            {
//			if (copy == null || copy.CodeElement().Name == null) // TCRFUN_LIBRARY_COPY
//				DiagnosticUtils.AddError(pgm.CodeElement, "Missing library copy in IDENTIFICATION DIVISION.", context);

                if (pdiv.UsingParameters != null && pdiv.UsingParameters.Count > 0)
                {
                    DiagnosticUtils.AddError(pdiv, "Illegal " + pdiv.UsingParameters.Count + " USING in library PROCEDURE DIVISION.", context);
                }

                for (int c = 0; c < errorMessages.Count; c++)
                {
                    DiagnosticUtils.AddError(elementsInError[c], errorMessages[c], context);
                }
            }
        }
Ejemplo n.º 4
0
        public static void CheckLibrary([NotNull] ProcedureDivision procedureDivision)
        {
            //A procedure or a function cannot contains another procedure or function declaration
            //So we only need to check ProcedureDivision of Program
            if (!(procedureDivision.Parent is Program))
            {
                return;
            }


            //If the procedure division contains a PUBLIC procedure or function then it's considered as a "Library"
            bool isLibrary = procedureDivision.Children.Any(c =>
            {
                var f = c.CodeElement as FunctionDeclarationHeader;
                return(f != null && f.Visibility == AccessModifier.Public);
            });

            if (isLibrary)
            {
                foreach (var child in procedureDivision.Children)
                {
                    //TCRFUN_ONLY_PARAGRAPH_AND_PUBLIC_FUNC_IN_LIBRARY
                    if (!(child is Paragraph || child is FunctionDeclaration))
                    {
                        CodeElement ce;
                        if (child.CodeElement != null)
                        {
                            ce = child.CodeElement;
                        }
                        else
                        {
                            ce = procedureDivision.CodeElement;
                        }
                        DiagnosticUtils.AddError(ce, "Illegal non-function or paragraph item in library " + child.Name + " / " + child.ID);
                    }
                }

                var pdiv = procedureDivision.CodeElement as ProcedureDivisionHeader;

                //TCRFUN_LIBRARY_PROCEDURE_NO_USING
                if (pdiv.UsingParameters != null && pdiv.UsingParameters.Count > 0)
                {
                    DiagnosticUtils.AddError(pdiv, "Illegal " + pdiv.UsingParameters.Count + " USING in library PROCEDURE DIVISION.");
                }
            }
        }
Ejemplo n.º 5
0
        private List <Section> BuildSections(ProcedureDivision procedureDivision)
        {
            var result = new List <Section>();
            var code   = procedureDivision.GetCode();

            foreach (Match sectionName in Constants.SectionRegex.Matches(code))
            {
                var name  = sectionName.Groups["sectionName"].Value;
                var begin = procedureDivision.StartIndex + sectionName.Index;
                var end   = procedureDivision.StartIndex + (sectionName.NextMatch().Success ? sectionName.NextMatch().Index : procedureDivision.Length);

                var section = new Section(procedureDivision.ParentCobolFile, name, begin, end);
                section.Procedures = BuildProcedures(section);

                result.Add(section);
            }

            return(result);
        }
Ejemplo n.º 6
0
 public override bool Visit(ProcedureDivision procedureDivision)
 {
     LibraryChecker.CheckLibrary(procedureDivision);
     return(true);
 }
Ejemplo n.º 7
0
 public virtual bool Visit(ProcedureDivision procedureDivision)
 {
     return(true);
 }
Ejemplo n.º 8
0
        public override bool Visit(ProcedureDivision procedureDivision)
        {
            var parent = procedureDivision.Parent as Program;

            return(parent != null && base.Visit(procedureDivision));
        }