//When a function is defined. public override object VisitStat_functionDef([NotNull] algoParser.Stat_functionDefContext context) { //Does a variable with this name already exist? if (Scopes.VariableExistsLowest(context.IDENTIFIER().GetText())) { Error.Fatal(context, "A variable with this name already exists, cannot create function with this name."); return(null); } //Getting parameters. List <string> params_ = new List <string>(); if (context.abstract_params() != null) { foreach (var param in context.abstract_params().IDENTIFIER()) { //Check if param already exists. if (params_.Contains(param.GetText())) { Error.Fatal(context, "The parameter with name '" + param.GetText() + "' is already defined in the function."); return(null); } params_.Add(param.GetText()); } } //No, it doesn't exist. Define it. AlgoFunction func = new AlgoFunction(context.statement().ToList(), params_, context.IDENTIFIER().GetText()); AlgoValue funcValue = new AlgoValue() { Type = AlgoValueType.Function, Value = func }; //Add to scope. Scopes.AddVariable(context.IDENTIFIER().GetText(), funcValue); return(null); }
/// <summary> /// Visit a parse tree produced by <see cref="algoParser.stat_functionDef"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitStat_functionDef([NotNull] algoParser.Stat_functionDefContext context) { return(VisitChildren(context)); }
/// <summary> /// Exit a parse tree produced by <see cref="algoParser.stat_functionDef"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitStat_functionDef([NotNull] algoParser.Stat_functionDefContext context) { }