private static bool GenerateStatement(Context expression, SymbolTable table, ILGenerator generator, Dictionary <string, LocalBuilder> variables, MethodEvaluatorBase parent)
        {
            if (expression.Children.Count == 2 && expression.Children.Last.Value is VariableAssignmentIdentifier v)
            {
                if (v.IsNewVariable)
                {
                    parent.GenerateLocalVariable(v.Identifier, v.NewVarType, generator);
                }
                Action GenerateVar = () => GenerateExpression(expression.Children.First.Value, table, generator, variables, parent);
                parent.GenerateVariableStore(generator, v.Identifier, GenerateVar);
                return(false);
            }

            GenerateExpression(expression, table, generator, variables, parent);
            if (expression is ReturnContext)
            {
                return(true);
            }
            return(false);
        }
 private static void GenerateExpression(Context expression, SymbolTable table, ILGenerator generator, Dictionary <string, LocalBuilder> variables, MethodEvaluatorBase parent)
 {
     if (expression is StringLiteral str)
     {
         generator.Emit(OpCodes.Ldstr, str.String);
     }
     else if (expression is IntLiteral num)
     {
         generator.Emit(OpCodes.Ldc_I4, num.Number);
     }
     else if (expression is IdentifierContext id)
     {
         var name = id.Identifier;
         if (name == "true" || name == "false")
         {
             if (name == "true")
             {
                 generator.Emit(OpCodes.Ldc_I4_1);
             }
             else
             {
                 generator.Emit(OpCodes.Ldc_I4_0);
             }
         }
         else
         {
             parent.GenerateVariableLoad(generator, name);
         }
     }
     else if (expression.Children.Count == 1)
     {
         GenerateExpression(expression.Children.First.Value, table, generator, variables, parent);
     }
     else if (expression is ExpressionContext e && e.IsFunctionCall)
     {
         GenerateFunctionCall(e.Children.First.Value as IdentifierContext, e.Children.Skip(1), table, generator, variables, parent);
     }
        public static bool Generate(Context expression, SymbolTable functionTable, ILGenerator generator, Dictionary <string, LocalBuilder> variables, MethodEvaluatorBase parent)
        {
            bool isRet = GenerateStatement(expression, functionTable, generator, variables, parent);

            if (isRet)
            {
                generator.Emit(OpCodes.Ret);
            }
            //for (; stackDepth > 0; stackDepth--) generator.Emit(OpCodes.Pop);
            return(isRet);
        }