コード例 #1
0
ファイル: Preprocessor.cs プロジェクト: Frazi1/SharpCompiler
        private static void Process(this ExtendedId extendedId, bool isVariable = true)
        {
            var scope = extendedId.Scope;

            if (isVariable)
            {
                var declaration = scope.GlobalVariableSearch(extendedId.Name);
                if (declaration == null)
                {
                    throw new ScopeException($"Variable with name \"{extendedId.Name}\" does not exist");
                }
                extendedId.VariableDeclaration = declaration;
                if (!declaration.Initialized)
                {
                    throw new ScopeException(
                              $"Variable with name \"{extendedId.Name}\" was not initialized before accessing");
                }
                extendedId.ReturnType = declaration.ReturnType;
            }
            else
            {
                FunctionDeclaration declaration = scope.GlobalFunctionSearch(extendedId.Name);
                extendedId.ReturnType = declaration != null
                    ? declaration.ReturnType
                    : throw new ScopeException($"Variable with name \"{extendedId.Name}\" does not exist.");
            }
        }
コード例 #2
0
        private void LoadOntoStack(ExtendedId extendedIdNode, ILGenerator ilGenerator)
        {
            if (varsLocalBuilders.Keys.Contains(extendedIdNode.VariableDeclaration.FullName))
            {
                var localBuilder = varsLocalBuilders[extendedIdNode.VariableDeclaration.FullName];

                ilGenerator.Emit(OpCodes.Ldloc, localBuilder);
            }
            else
            {
                if (extendedIdNode.VariableDeclaration != null)
                {
                    if (extendedIdNode.VariableDeclaration is FunctionVariableDeclarationParameter fdParam)
                    {
                        ilGenerator.Emit(OpCodes.Ldarg, (int)extendedIdNode.VariableDeclaration.Index);
                        return;
                    }
                }
            }
            if (fieldBuilders.ContainsKey(extendedIdNode.VariableDeclaration.FullName))
            {
                var fieldBuilder = fieldBuilders[extendedIdNode.VariableDeclaration.FullName];

                ilGenerator.Emit(OpCodes.Ldsfld, fieldBuilder);
            }
        }
コード例 #3
0
        public void Construct(CommonTree syntaxAttributeUsage)
        {
            Name = new ExtendedId(this, Scope);
            var syntaxExtendedId = syntaxAttributeUsage.GetChild(0).CastTo <CommonTree>();

            Name.Construct(syntaxExtendedId);

            var syntaxParameters = syntaxAttributeUsage.GetChild(1).CastTo <CommonTree>();

            if (syntaxParameters.ChildCount > 0)
            {
                syntaxParameters.Children.Cast <CommonTree>().ForEach(syntaxParameter =>
                {
                    var parameter = TreeHelper.GetExpression(this, Scope, syntaxParameter);
                    parameter.Construct(syntaxParameter);
                    FunctionCallParameters.Add(parameter);
                });
            }
        }
コード例 #4
0
 private static IEnumerable <IInstruction> GetVariableReferenceInstructions(this ExtendedId extendedId)
 {
     return(GetLoadInstruction(extendedId.VariableDeclaration).AsList());
 }
コード例 #5
0
 /// <summary>
 /// obsolete
 /// </summary>
 /// <param name="exId"></param>
 /// <param name="ilGenerator"></param>
 private void PopAndStore(ExtendedId exId, ILGenerator ilGenerator)
 {
     PopAndStore(exId.VariableDeclaration.FullName, exId.VariableDeclaration.Index, ilGenerator);
 }
コード例 #6
0
 private void GenerateExtendedId(ExtendedId extendedIdNode, ILGenerator ilGenerator)
 {
     LoadOntoStack(extendedIdNode, ilGenerator);
 }