public override void EnterFunctionDeclarationHeader(CodeElementsParser.FunctionDeclarationHeaderContext context) { var type = FunctionType.Undefined; if (context.PROCEDURE() != null) { type = FunctionType.Procedure; } if (context.FUNCTION() != null) { type = FunctionType.Function; } //TCRFUN_DEFAULT_ACCESS_MODIFIER rule is respected here. //By default a function or procedure is private even if PRIVATE keyword is not given. //If PUBLIC keyword is set, the function/procedure as to be set PUBLIC. var visibility = context.PUBLIC() != null ? AccessModifier.Public : AccessModifier.Private; SymbolDefinition name = null; if (context.functionNameDefinition() != null) { name = CobolWordsBuilder.CreateFunctionNameDefinition(context.functionNameDefinition()); } Context = context; CodeElement = new FunctionDeclarationHeader(name, visibility, type); }
public override void EnterFunctionDeclarationHeader(CodeElementsParser.FunctionDeclarationHeaderContext context) { var type = FunctionType.Undefined; if (context.PROCEDURE() != null) { type = FunctionType.Procedure; } if (context.FUNCTION() != null) { type = FunctionType.Function; } // TCRFUN_NO_DEFAULT_ACCESS_MODIFIER // As the grammar enforces that there must be one least one of the PUBLIC or PRIVATE keywords, // there will be a syntax error if there is neither of these two keywords. // So, the fact of considering a function PRIVATE by default does not break this rule. var visibility = context.PUBLIC() != null ? AccessModifier.Public : AccessModifier.Private; SymbolDefinition name = null; if (context.functionNameDefinition() != null) { name = CobolWordsBuilder.CreateFunctionNameDefinition(context.functionNameDefinition()); } Context = context; CodeElement = new FunctionDeclarationHeader(name, visibility, type); }
public override void EnterFunctionDeclarationHeader(CodeElementsParser.FunctionDeclarationHeaderContext context) { var visibility = context.PUBLIC() != null ? AccessModifier.Public : AccessModifier.Private; QualifiedName name = null; if (context.UserDefinedWord() != null) { var token = ParseTreeUtils.GetTokenFromTerminalNode(context.UserDefinedWord()); name = new URI(token.Text); } Context = context; CodeElement = new FunctionDeclarationHeader(name, visibility); }
public static void OnCodeElement(FunctionDeclarationHeader function, CodeElementsParser.FunctionDeclarationHeaderContext context) { if (function.ActualType == FunctionType.Undefined) { DiagnosticUtils.AddError(function, "Incompatible parameter clauses for " + ToString(function.UserDefinedType) + " \"" + function.Name + "\"", context); } else if ((function.ActualType == FunctionType.Function && function.UserDefinedType == FunctionType.Procedure) || (function.ActualType == FunctionType.Procedure && function.UserDefinedType == FunctionType.Function)) { var message = "Symbol \"" + function.Name + "\" is defined as " + ToString(function.UserDefinedType) + ", but parameter clauses describe a " + ToString(function.ActualType); DiagnosticUtils.AddError(function, message, context); } }
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); }
public virtual void StartFunctionDeclaration(FunctionDeclarationHeader header) { header.SetLibrary(CurrentProgram.Identification.ProgramName.Name); var node = new FunctionDeclaration(header) { Label = uidfactory.FromOriginal(header?.FunctionName.Name), Library = CurrentProgram.Identification.ProgramName.Name }; _IsInsideProcedure = true; CurrentProgram.Root.SetFlag(Node.Flag.ContainsProcedure, true); //DO NOT change this without checking all references of Library. // (SymbolTable - function, type finding could be impacted) //Function must be added to Declarations scope var declarationSymbolTable = SyntaxTree.CurrentNode.SymbolTable.GetTableFromScope(SymbolTable.Scope.Declarations); declarationSymbolTable.AddFunction(node); Enter(node, header, new SymbolTable(declarationSymbolTable, SymbolTable.Scope.Function)); var declaration = (FunctionDeclarationHeader)CurrentNode.CodeElement; var funcProfile = ((FunctionDeclaration)CurrentNode).Profile; //Get functionprofile to set parameters foreach (var parameter in declaration.Profile.InputParameters) //Set Input Parameters { var paramNode = new ParameterDescription(parameter); paramNode.SymbolTable = CurrentNode.SymbolTable; paramNode.SetFlag(Node.Flag.LinkageSectionNode, true); funcProfile.InputParameters.Add(paramNode); paramNode.SetParent(CurrentNode); CurrentNode.SymbolTable.AddVariable(paramNode); } foreach (var parameter in declaration.Profile.OutputParameters) //Set Output Parameters { var paramNode = new ParameterDescription(parameter); paramNode.SymbolTable = CurrentNode.SymbolTable; paramNode.SetFlag(Node.Flag.LinkageSectionNode, true); funcProfile.OutputParameters.Add(paramNode); paramNode.SetParent(CurrentNode); CurrentNode.SymbolTable.AddVariable(paramNode); } foreach (var parameter in declaration.Profile.InoutParameters) //Set Inout Parameters { var paramNode = new ParameterDescription(parameter); paramNode.SymbolTable = CurrentNode.SymbolTable; paramNode.SetFlag(Node.Flag.LinkageSectionNode, true); funcProfile.InoutParameters.Add(paramNode); paramNode.SetParent(CurrentNode); CurrentNode.SymbolTable.AddVariable(paramNode); } if (declaration.Profile.ReturningParameter != null) //Set Returning Parameters { var paramNode = new ParameterDescription(declaration.Profile.ReturningParameter); paramNode.SymbolTable = CurrentNode.SymbolTable; paramNode.SetFlag(Node.Flag.LinkageSectionNode, true); ((FunctionDeclaration)CurrentNode).Profile.ReturningParameter = paramNode; paramNode.SetParent(CurrentNode); CurrentNode.SymbolTable.AddVariable(paramNode); } AnalyticsWrapper.Telemetry.TrackEvent(EventType.FunctionDeclared, declaration.FunctionName.ToString(), LogType.TypeCobolUsage); }