Beispiel #1
0
 /// <summary>
 /// <summary>
 /// Compute the typed proper paths of a data defintion. The proper root paths are
 /// root procedures path and data definition variables path.
 /// </summary>
 /// <param name="dataNode">The node owning the data dedinition.</param>
 /// <param name="dataDesc">The Data Description to compute the proper root path</param>
 /// <param name="properType"> The Proper type of the data definition </param>
 /// <param name="pathProcedures">[out] root procedures path</param>
 /// <param name="pathVariables">[out]typed variables path</param>
 public static void ComputeTypedProperPaths(Node dataNode, DataDescriptionEntry dataDesc, Compiler.Nodes.TypeDefinition properType, out List <string> pathProcedures, out List <Tuple <string, string> > pathVariables)
 {
     System.Diagnostics.Contracts.Contract.Requires(properType != null);
     pathProcedures = new List <string>();
     pathVariables  = new List <Tuple <string, string> >();
     if (properType == null)
     {
         return;
     }
     pathVariables.Add(new Tuple <string, string>(dataDesc.Name, properType.Name));
     Compiler.Nodes.Node parent = dataNode.Parent;
     while (parent != null)
     {
         if (parent is TypeCobol.Compiler.Nodes.DataDefinition)
         {
             TypeCobol.Compiler.Nodes.DataDefinition dataParent = parent as TypeCobol.Compiler.Nodes.DataDefinition;
             pathVariables.Add(new System.Tuple <string, string>(dataParent.Name, ""));
         }
         else if (!string.IsNullOrEmpty(parent.Name))
         {
             pathProcedures.Add(parent.Name);
         }
         parent = parent.Parent;
     }
 }
Beispiel #2
0
        /// <summary>
        /// Tries to detect a (PIC|PICTURE) construction for a Data Description Entry.
        /// </summary>
        /// <param name="dataDescEntry">The Data Description Entry Node</param>
        /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param>
        /// <returns>The string representing the PIC clause </returns>
        internal static string ExtractPicTokensValues(DataDescriptionEntry dataDescEntry, out bool bHasPeriod)
        {
            bHasPeriod = false;
            StringBuilder sb = new StringBuilder();

            if (dataDescEntry.ConsumedTokens != null)
            {
                if (dataDescEntry.ConsumedTokens != null)
                {
                    int i = 0;
                    while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PIC && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PICTURE)
                    {
                        i++;
                    }
                    if (i < dataDescEntry.ConsumedTokens.Count)
                    {
                        sb.Append(string.Intern(" "));
                        sb.Append(dataDescEntry.ConsumedTokens[i].Text);
                    }
                    while (++i < dataDescEntry.ConsumedTokens.Count)
                    {
                        if ((i != dataDescEntry.ConsumedTokens.Count - 1) || (dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PeriodSeparator))
                        {
                            sb.Append(string.Intern(" "));//Add a space but not before a a Period Separator
                        }
                        sb.Append(dataDescEntry.ConsumedTokens[i].Text);
                        if (i == dataDescEntry.ConsumedTokens.Count - 1)
                        {
                            bHasPeriod = dataDescEntry.ConsumedTokens[i].TokenType == Compiler.Scanner.TokenType.PeriodSeparator;
                        }
                    }
                }
            }
            return(sb.ToString());
        }
Beispiel #3
0
        private static Nodes.DataDescription CreateData(int level, string name, char type, int length)
        {
            var data = new DataDescriptionEntry();

            data.LevelNumber = new GeneratedIntegerValue(level);
            data.DataName    = new SymbolDefinition(new GeneratedAlphanumericValue(name), SymbolType.DataName);
            data.Picture     = new GeneratedAlphanumericValue(String.Format("{0}({1})", type, length));
            data.DataType    = DataType.Create(data.Picture.Value);
            return(new Nodes.DataDescription(data));
        }
Beispiel #4
0
 internal static ITextLine CreateDataDefinition(DataDefinitionEntry data_def, int level, int indent, bool isCustomType, bool isFirst, TypeDefinition customtype = null)
 {
     if (data_def is DataDescriptionEntry)
     {
         DataDescriptionEntry data = data_def as DataDescriptionEntry;
         bool bHasPeriod           = false;
         var  line = GetIndent(level, indent, isFirst);
         line.Append(level.ToString("00"));
         if (data_def.Name != null)
         {
             line.Append(' ').Append(data.Name);
         }
         if (!isCustomType)
         {
             string text = ExtractPicTokensValues(data, out bHasPeriod);
             if (text.Length > 0)
             {
                 line.Append(text);
             }
             else
             {
                 line.Append(" PIC ").Append(data.Picture);
             }
         }
         else if (customtype != null)
         { //This variable will have no subtypes as children at all
           //So Auto detect a type based on scalar COBOL typedef.
             string text = ExtractAnyCobolScalarTypeDef(customtype, out bHasPeriod);
             line.Append(text);
         }
         if (!bHasPeriod)
         {
             line.Append('.');
         }
         return(new TextLineSnapshot(-1, line.ToString(), null));
     }
     else if (data_def is DataConditionEntry || data_def is DataRenamesEntry || data_def is DataRedefinesEntry)
     {
         bool   bHasPeriod = false;
         var    line       = GetIndent(level, indent, isFirst);
         string text       = ConsumedTokenToString(data_def, out bHasPeriod);
         line.Append(text);
         if (!bHasPeriod)
         {
             line.Append('.');
         }
         return(new TextLineSnapshot(-1, line.ToString(), null));
     }
     else
     {//Humm ... It will be a Bug
         System.Diagnostics.Debug.Assert(data_def is DataDescriptionEntry || data_def is DataConditionEntry);
     }
     return(null);
 }
Beispiel #5
0
 /// <summary>
 /// Extract All Tokens after encountering a LevelNumber token
 /// </summary>
 /// <param name="dataDescEntry">The Data Description Entry Node</param>
 /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param>
 /// <returns>The string representing all tokens after a LevelNumber </returns>
 internal static string ExtractTokensValuesAfterLevel(ColumnsLayout? layout, DataDescriptionEntry dataDescEntry, out bool bHasPeriod, Func<Compiler.Scanner.Token, string> tokenFilter = null)
 {
     bHasPeriod = false;
     StringBuilder sb = new StringBuilder();
     if (dataDescEntry.ConsumedTokens != null)
     {
         int i = 0;
         while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.LevelNumber)
             i++;
         FlushConsumedTokens(layout, i, dataDescEntry.ConsumedTokens, sb, out bHasPeriod, tokenFilter);
     }
     return sb.ToString();
 }
Beispiel #6
0
        /// <summary>
        /// Extract All Tokens after encountering a LevelNumber token
        /// </summary>
        /// <param name="dataDescEntry">The Data Description Entry Node</param>
        /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param>
        /// <returns>The string representing all tokens after a LevelNumber </returns>
        internal static string ExtractTokensValuesAfterLevel(DataDescriptionEntry dataDescEntry, out bool bHasPeriod)
        {
            bHasPeriod = false;
            StringBuilder sb = new StringBuilder();

            if (dataDescEntry.ConsumedTokens != null)
            {
                if (dataDescEntry.ConsumedTokens != null)
                {
                    int i = 0;
                    while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.LevelNumber)
                    {
                        i++;
                    }
                    FlushConsumedTokens(++i, dataDescEntry.ConsumedTokens, sb, out bHasPeriod);
                }
            }
            return(sb.ToString());
        }
        public static void OnCodeElement(DataDescriptionEntry data, CodeElementsParser.DataDescriptionEntryContext context)
        {
            var external = GetContext(data, context?.externalClause());
            var global   = GetContext(data, context?.globalClause());

            if (data.DataName == null)
            {
                if (!data.IsFiller)
                {
                    DiagnosticUtils.AddError(data, "Data name or FILLER expected", context?.dataNameDefinition());
                }
                if (data.IsExternal)
                {
                    DiagnosticUtils.AddError(data,
                                             "Data name must be specified for any entry containing the EXTERNAL clause", external);
                }
                if (data.IsGlobal)
                {
                    DiagnosticUtils.AddError(data,
                                             "Data name must be specified for any entry containing the GLOBAL clause", global);
                }
            }
            else
            {
                if (data.LevelNumber != null && data.IsExternal && data.LevelNumber.Value != 01)
                {
                    DiagnosticUtils.AddError(data, "External is only allowed for level 01", external);
                }

                if (data.LevelNumber != null &&
                    !((data.LevelNumber.Value >= 01 && data.LevelNumber.Value <= 49) ||
                      data.LevelNumber.Value == 66 || data.LevelNumber.Value == 77 || data.LevelNumber.Value == 88))
                {
                    DiagnosticUtils.AddError(data,
                                             "Data must be declared between level 01 to 49, or equals to 66, 77, 88",
                                             context?.dataNameDefinition());
                }
            }
        }
Beispiel #8
0
        /// <summary>
        /// Tries to detect a (PIC|PICTURE) construction for a Data Description Entry.
        /// </summary>
        /// <param name="dataDescEntry">The Data Description Entry Node</param>
        /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param>
        /// <returns>The string representing the PIC clause </returns>
        internal static string ExtractPicTokensValues(DataDescriptionEntry dataDescEntry, out bool bHasPeriod)
        {
            bHasPeriod = false;
            StringBuilder sb = new StringBuilder();

            if (dataDescEntry.ConsumedTokens != null)
            {
                if (dataDescEntry.ConsumedTokens != null)
                {
                    int i = 0;
                    while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PIC && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PICTURE)
                    {
                        i++;
                    }
                    if (i < dataDescEntry.ConsumedTokens.Count)
                    {
                        sb.Append(string.Intern(" "));
                        sb.Append(dataDescEntry.ConsumedTokens[i].Text);
                    }
                    FlushConsumedTokens(++i, dataDescEntry.ConsumedTokens, sb, out bHasPeriod);
                }
            }
            return(sb.ToString());
        }
Beispiel #9
0
            private static IToken BuildCodeElementFromType(CodeElementType type, Token lastTokenBeforeError, string informationText)
            {
                CodeElement codeElement = null;

                switch (type)
                {
                case CodeElementType.ProgramIdentification:
                    codeElement = new ProgramIdentification();
                    break;

                case CodeElementType.ProgramEnd:
                    codeElement = new ProgramEnd();
                    break;

                case CodeElementType.ClassIdentification:
                    codeElement = new ClassIdentification();
                    break;

                case CodeElementType.ClassEnd:
                    codeElement = new ClassEnd();
                    break;

                case CodeElementType.FactoryIdentification:
                    codeElement = new FactoryIdentification();
                    break;

                case CodeElementType.FactoryEnd:
                    codeElement = new FactoryEnd();
                    break;

                case CodeElementType.ObjectIdentification:
                    codeElement = new ObjectIdentification();
                    break;

                case CodeElementType.ObjectEnd:
                    codeElement = new ObjectEnd();
                    break;

                case CodeElementType.MethodIdentification:
                    codeElement = new MethodIdentification();
                    break;

                case CodeElementType.MethodEnd:
                    codeElement = new MethodEnd();
                    break;

                case CodeElementType.EnvironmentDivisionHeader:
                    codeElement = new EnvironmentDivisionHeader();
                    break;

                case CodeElementType.DataDivisionHeader:
                    codeElement = new DataDivisionHeader();
                    break;

                case CodeElementType.ProcedureDivisionHeader:
                    codeElement = new ProcedureDivisionHeader();
                    break;

                case CodeElementType.DeclarativesHeader:
                    codeElement = new DeclarativesHeader();
                    break;

                case CodeElementType.DeclarativesEnd:
                    codeElement = new DeclarativesEnd();
                    break;

                case CodeElementType.SectionHeader:
                    codeElement = new SectionHeader();
                    break;

                case CodeElementType.ConfigurationSectionHeader:
                    codeElement = new ConfigurationSectionHeader();
                    break;

                case CodeElementType.InputOutputSectionHeader:
                    codeElement = new InputOutputSectionHeader();
                    break;

                case CodeElementType.FileSectionHeader:
                    codeElement = new FileSectionHeader();
                    break;

                case CodeElementType.WorkingStorageSectionHeader:
                    codeElement = new WorkingStorageSectionHeader();
                    break;

                case CodeElementType.LocalStorageSectionHeader:
                    codeElement = new LocalStorageSectionHeader();
                    break;

                case CodeElementType.LinkageSectionHeader:
                    codeElement = new LinkageSectionHeader();
                    break;

                case CodeElementType.ParagraphHeader:
                    codeElement = new ParagraphHeader();
                    break;

                case CodeElementType.FileControlParagraphHeader:
                    codeElement = new FileControlParagraphHeader();
                    break;

                case CodeElementType.IOControlParagraphHeader:
                    codeElement = new IOControlParagraphHeader();
                    break;

                case CodeElementType.SentenceEnd:
                    codeElement = new SentenceEnd();
                    break;

                case CodeElementType.FileDescriptionEntry:
                    codeElement = new FileDescriptionEntry();
                    break;

                case CodeElementType.DataDescriptionEntry:
                    codeElement = new DataDescriptionEntry();
                    break;

                case CodeElementType.DataRedefinesEntry:
                    codeElement = new DataRedefinesEntry();
                    break;

                case CodeElementType.DataRenamesEntry:
                    codeElement = new DataRenamesEntry();
                    break;

                case CodeElementType.DataConditionEntry:
                    codeElement = new DataConditionEntry();
                    break;

                case CodeElementType.FileControlEntry:
                    codeElement = new FileControlEntry();
                    break;

                case CodeElementType.IOControlEntry:
                    codeElement = new RerunIOControlEntry();
                    break;

                case CodeElementType.SourceComputerParagraph:
                    codeElement = new SourceComputerParagraph();
                    break;

                case CodeElementType.ObjectComputerParagraph:
                    codeElement = new ObjectComputerParagraph();
                    break;

                case CodeElementType.SpecialNamesParagraph:
                    codeElement = new SpecialNamesParagraph();
                    break;

                case CodeElementType.RepositoryParagraph:
                    codeElement = new RepositoryParagraph();
                    break;

                case CodeElementType.AcceptStatement:
                    codeElement = new AcceptFromInputDeviceStatement();
                    break;

                case CodeElementType.AddStatement:
                    codeElement = new AddSimpleStatement();
                    break;

                case CodeElementType.AlterStatement:
                    codeElement = new AlterStatement();
                    break;

                case CodeElementType.CallStatement:
                    codeElement = new CallStatement();
                    break;

                case CodeElementType.CancelStatement:
                    codeElement = new CancelStatement();
                    break;

                case CodeElementType.CloseStatement:
                    codeElement = new CloseStatement();
                    break;

                case CodeElementType.ComputeStatement:
                    codeElement = new ComputeStatement();
                    break;

                case CodeElementType.ContinueStatement:
                    codeElement = new ContinueStatement();
                    break;

                case CodeElementType.DeleteStatement:
                    codeElement = new DeleteStatement();
                    break;

                case CodeElementType.DisplayStatement:
                    codeElement = new DisplayStatement();
                    break;

                case CodeElementType.DivideStatement:
                    codeElement = new DivideSimpleStatement();
                    break;

                case CodeElementType.EntryStatement:
                    codeElement = new EntryStatement();
                    break;

                case CodeElementType.EvaluateStatement:
                    codeElement = new EvaluateStatement();
                    break;

                case CodeElementType.ExecStatement:
                    codeElement = new ExecStatement();
                    break;

                case CodeElementType.ExitMethodStatement:
                    codeElement = new ExitMethodStatement();
                    break;

                case CodeElementType.ExitProgramStatement:
                    codeElement = new ExitProgramStatement();
                    break;

                case CodeElementType.ExitStatement:
                    codeElement = new ExitStatement();
                    break;

                case CodeElementType.GobackStatement:
                    codeElement = new GobackStatement();
                    break;

                case CodeElementType.GotoStatement:
                    codeElement = new GotoSimpleStatement();
                    break;

                case CodeElementType.IfStatement:
                    codeElement = new IfStatement();
                    break;

                case CodeElementType.InitializeStatement:
                    codeElement = new InitializeStatement();
                    break;

                case CodeElementType.InspectStatement:
                    codeElement = new InspectTallyingStatement();
                    break;

                case CodeElementType.InvokeStatement:
                    codeElement = new InvokeStatement();
                    break;

                case CodeElementType.MergeStatement:
                    codeElement = new MergeStatement();
                    break;

                case CodeElementType.MoveStatement:
                    codeElement = new MoveSimpleStatement(null, null, null);
                    break;

                case CodeElementType.MultiplyStatement:
                    codeElement = new MultiplySimpleStatement();
                    break;

                case CodeElementType.NextSentenceStatement:
                    codeElement = new NextSentenceStatement();
                    break;

                case CodeElementType.OpenStatement:
                    codeElement = new OpenStatement();
                    break;

                case CodeElementType.PerformProcedureStatement:
                    codeElement = new PerformProcedureStatement();
                    break;

                case CodeElementType.PerformStatement:
                    codeElement = new PerformStatement();
                    break;

                case CodeElementType.ReadStatement:
                    codeElement = new ReadStatement();
                    break;

                case CodeElementType.ReleaseStatement:
                    codeElement = new ReleaseStatement();
                    break;

                case CodeElementType.ReturnStatement:
                    codeElement = new ReturnStatement();
                    break;

                case CodeElementType.RewriteStatement:
                    codeElement = new RewriteStatement();
                    break;

                case CodeElementType.SearchStatement:
                    codeElement = new SearchSerialStatement();
                    break;

                case CodeElementType.SetStatement:
                    codeElement = new SetStatementForAssignment();
                    break;

                case CodeElementType.SortStatement:
                    codeElement = new SortStatement();
                    break;

                case CodeElementType.StartStatement:
                    codeElement = new StartStatement();
                    break;

                case CodeElementType.StopStatement:
                    codeElement = new StopStatement();
                    break;

                case CodeElementType.StringStatement:
                    codeElement = new StringStatement();
                    break;

                case CodeElementType.SubtractStatement:
                    codeElement = new SubtractSimpleStatement();
                    break;

                case CodeElementType.UnstringStatement:
                    codeElement = new UnstringStatement();
                    break;

                case CodeElementType.UseStatement:
                    codeElement = new UseAfterIOExceptionStatement();
                    break;

                case CodeElementType.WriteStatement:
                    codeElement = new WriteStatement();
                    break;

                case CodeElementType.XmlGenerateStatement:
                    codeElement = new XmlGenerateStatement();
                    break;

                case CodeElementType.XmlParseStatement:
                    codeElement = new XmlParseStatement();
                    break;

                case CodeElementType.AtEndCondition:
                    codeElement = new AtEndCondition();
                    break;

                case CodeElementType.NotAtEndCondition:
                    codeElement = new NotAtEndCondition();
                    break;

                case CodeElementType.AtEndOfPageCondition:
                    codeElement = new AtEndOfPageCondition();
                    break;

                case CodeElementType.NotAtEndOfPageCondition:
                    codeElement = new NotAtEndOfPageCondition();
                    break;

                case CodeElementType.OnExceptionCondition:
                    codeElement = new OnExceptionCondition();
                    break;

                case CodeElementType.NotOnExceptionCondition:
                    codeElement = new NotOnExceptionCondition();
                    break;

                case CodeElementType.OnOverflowCondition:
                    codeElement = new OnOverflowCondition();
                    break;

                case CodeElementType.NotOnOverflowCondition:
                    codeElement = new NotOnOverflowCondition();
                    break;

                case CodeElementType.InvalidKeyCondition:
                    codeElement = new InvalidKeyCondition();
                    break;

                case CodeElementType.NotInvalidKeyCondition:
                    codeElement = new NotInvalidKeyCondition();
                    break;

                case CodeElementType.OnSizeErrorCondition:
                    codeElement = new OnSizeErrorCondition();
                    break;

                case CodeElementType.NotOnSizeErrorCondition:
                    codeElement = new NotOnSizeErrorCondition();
                    break;

                case CodeElementType.ElseCondition:
                    codeElement = new ElseCondition();
                    break;

                case CodeElementType.WhenCondition:
                    codeElement = new WhenCondition();
                    break;

                case CodeElementType.WhenOtherCondition:
                    codeElement = new WhenOtherCondition();
                    break;

                case CodeElementType.WhenSearchCondition:
                    codeElement = new WhenSearchCondition();
                    break;

                case CodeElementType.AddStatementEnd:
                    codeElement = new AddStatementEnd();
                    break;

                case CodeElementType.CallStatementEnd:
                    codeElement = new CallStatementEnd();
                    break;

                case CodeElementType.ComputeStatementEnd:
                    codeElement = new ComputeStatementEnd();
                    break;

                case CodeElementType.DeleteStatementEnd:
                    codeElement = new DeleteStatementEnd();
                    break;

                case CodeElementType.DivideStatementEnd:
                    codeElement = new DivideStatementEnd();
                    break;

                case CodeElementType.EvaluateStatementEnd:
                    codeElement = new EvaluateStatementEnd();
                    break;

                case CodeElementType.IfStatementEnd:
                    codeElement = new IfStatementEnd();
                    break;

                case CodeElementType.InvokeStatementEnd:
                    codeElement = new InvokeStatementEnd();
                    break;

                case CodeElementType.MultiplyStatementEnd:
                    codeElement = new MultiplyStatementEnd();
                    break;

                case CodeElementType.PerformStatementEnd:
                    codeElement = new PerformStatementEnd();
                    break;

                case CodeElementType.ReadStatementEnd:
                    codeElement = new ReadStatementEnd();
                    break;

                case CodeElementType.ReturnStatementEnd:
                    codeElement = new ReturnStatementEnd();
                    break;

                case CodeElementType.RewriteStatementEnd:
                    codeElement = new RewriteStatementEnd();
                    break;

                case CodeElementType.SearchStatementEnd:
                    codeElement = new SearchStatementEnd();
                    break;

                case CodeElementType.StartStatementEnd:
                    codeElement = new StartStatementEnd();
                    break;

                case CodeElementType.StringStatementEnd:
                    codeElement = new StringStatementEnd();
                    break;

                case CodeElementType.SubtractStatementEnd:
                    codeElement = new SubtractStatementEnd();
                    break;

                case CodeElementType.UnstringStatementEnd:
                    codeElement = new UnstringStatementEnd();
                    break;

                case CodeElementType.WriteStatementEnd:
                    codeElement = new WriteStatementEnd();
                    break;

                case CodeElementType.XmlStatementEnd:
                    codeElement = new XmlStatementEnd();
                    break;

                case CodeElementType.LibraryCopy:
                    codeElement = new LibraryCopyCodeElement();
                    break;

                case CodeElementType.FunctionDeclarationHeader:
                    codeElement = new FunctionDeclarationHeader(null, AccessModifier.Private, FunctionType.Undefined);
                    break;

                case CodeElementType.FunctionDeclarationEnd:
                    codeElement = new FunctionDeclarationEnd();
                    break;

                default:
                    throw new NotImplementedException();
                }
                if (lastTokenBeforeError != null)
                {
                    var missingToken = new MissingToken(TokenType.InvalidToken, informationText, lastTokenBeforeError.TokensLine, lastTokenBeforeError.StopIndex);
                    codeElement.ConsumedTokens.Add(missingToken);
                }
                return(codeElement);
            }
Beispiel #10
0
        public virtual void StartDataDescriptionEntry(DataDescriptionEntry entry)
        {
            var dataTypeDescriptionEntry = entry as DataTypeDescriptionEntry;

            if (dataTypeDescriptionEntry != null)
            {
                StartTypeDefinitionEntry(dataTypeDescriptionEntry);
            }
            else
            {
                SetCurrentNodeToTopLevelItem(entry.LevelNumber);

                //Update DataType of CodeElement by searching info on the declared Type into SymbolTable.
                //Note that the AST is not complete here, but you can only refer to a Type that has previously been defined.
                var node = new DataDescription(entry);
                if (_CurrentTypeDefinition != null)
                {
                    node.ParentTypeDefinition = _CurrentTypeDefinition;
                }
                Enter(node);

                if (entry.Indexes != null && entry.Indexes.Any())
                {
                    var table = node.SymbolTable;
                    foreach (var index in entry.Indexes)
                    {
                        if (node.CodeElement().IsGlobal)
                        {
                            table = table.GetTableFromScope(SymbolTable.Scope.Global);
                        }

                        var indexNode = new IndexDefinition(index);
                        Enter(indexNode, null, table);
                        if (_CurrentTypeDefinition != null)
                        {
                            indexNode.ParentTypeDefinition = _CurrentTypeDefinition;
                        }
                        table.AddVariable(indexNode);
                        Exit();
                    }
                }

                var types = node.SymbolTable.GetType(node);
                if (types.Count == 1)
                {
                    entry.DataType.RestrictionLevel = types[0].DataType.RestrictionLevel;
                }
                //else do nothing, it's an error that will be handled by Cobol2002Checker

                if (_IsInsideWorkingStorageContext)
                {
                    node.SetFlag(Node.Flag.WorkingSectionNode, true);      //Set flag to know that this node belongs to Working Storage Section
                }
                if (_IsInsideLinkageSectionContext)
                {
                    node.SetFlag(Node.Flag.LinkageSectionNode, true);      //Set flag to know that this node belongs to Linkage Section
                }
                if (_IsInsideLocalStorageSectionContext)
                {
                    node.SetFlag(Node.Flag.LocalStorageSectionNode, true); //Set flag to know that this node belongs to Local Storage Section
                }
                if (_IsInsideFileSectionContext)
                {
                    node.SetFlag(Node.Flag.FileSectionNode, true);         //Set flag to know that this node belongs to File Section
                }
                if (_IsInsideGlobalStorageSection)
                {
                    node.SetFlag(Node.Flag.GlobalStorageSection, true);         //Set flag to know that this node belongs to Global Storage Section
                }
                AddToSymbolTable(node);
            }
        }
Beispiel #11
0
 /// <summary>
 /// Tries to detect a (PIC|PICTURE) construction for a Data Description Entry.
 /// </summary>
 /// <param name="dataDescEntry">The Data Description Entry Node</param>
 /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param>
 /// <returns>The string representing the PIC clause </returns>
 internal static string ExtractPicTokensValues(ColumnsLayout? layout, DataDescriptionEntry dataDescEntry, out bool bHasPeriod, out bool globalSeen)
 {
     return ExtractPicTokensValues(layout, dataDescEntry.ConsumedTokens, out bHasPeriod, out globalSeen);
 }
Beispiel #12
0
        /// <summary>
        /// Tries to extract all remaining tokens after a Type Name.
        /// </summary>
        /// <param name="customtype">The Type definition node</param>
        /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param>
        /// <returns>The string representing the Tokens after TYPE Name</returns>
        internal static string ExtractTokensValuesAfterTypeName(ColumnsLayout? layout, DataDescriptionEntry dataDescEntry, out bool bHasPeriod,
            out bool globalSeen,
            Func<Compiler.Scanner.Token, string> tokenFilter = null)
        {
            globalSeen = false;
            bHasPeriod = false;
            StringBuilder sb = new StringBuilder();
            if (dataDescEntry.ConsumedTokens != null)
            {
                int i = 0;
                while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.TYPE)
                    i++;
                i++;//Ignore the Name of the Type.

                ++i;

                //Ignore qualified type name
                while (i < dataDescEntry.ConsumedTokens.Count &&
                       dataDescEntry.ConsumedTokens[i].TokenType == Compiler.Scanner.TokenType.QualifiedNameSeparator)
                {                    
                    i += 2; //skip  :: and the next type name
                }
                globalSeen = ContainsToken(dataDescEntry.ConsumedTokens, i - 1, TokenType.GLOBAL);
                FlushConsumedTokens(layout, i - 1, dataDescEntry.ConsumedTokens, sb, out bHasPeriod, tokenFilter);
            }
            return sb.ToString();
        }
Beispiel #13
0
 public virtual bool Visit(DataDescriptionEntry dataDescriptionEntry)
 {
     return(true);
 }