Пример #1
0
        public static void ResolveArrayElement(ArrayElementExpression arrayElement, Table.Table table, bool asAdressor = false)
        {
            if (table.CheckIdentifier(arrayElement.ArrayName) && asAdressor)
            {
                TableIdentifier tableIdentifier = table.FetchIdentifier(arrayElement.ArrayName);
                if (tableIdentifier.Type is String)
                {
                    ReportError(new CannotChangeTheString(arrayElement.SourceContext));
                }
            }

            if (table.CheckIdentifier(arrayElement.ArrayName) && table.FetchIdentifier(arrayElement.ArrayName).Type is ArrayType)
            {
                TableIdentifier tableIdentifier = table.FetchIdentifier(arrayElement.ArrayName);
                arrayElement.ArrayDimension = (ushort)((ArrayType)tableIdentifier.Type).Dimension;
                arrayElement.Type           = ((ArrayType)tableIdentifier.Type).GetDimensionElementType(arrayElement.Dimension);
                arrayElement.ArrayType      = tableIdentifier.Type;

                if (arrayElement.Type is null || arrayElement.ArrayDimension != arrayElement.Dimension)
                {
                    ReportError(new WrongArrayElementDimension(arrayElement.SourceContext));
                }
            }
            else
            {
                ReportError(new ArrayIsNotDeclared(arrayElement.ArrayName, arrayElement.SourceContext));
            }
        }
Пример #2
0
        public static void ResolveIdentifierExpression(IdentifierExpression identifier, Table.Table table, EmbeddedStatement initializedInBlock, bool checkInit = true)
        {
            if (identifier.IdentifierState == IdentifierExpression.State.Decl)
            {
                if (!table.PushIdentifier(identifier, table == GlobalTable.Table ? true : false))
                {
                    ReportError(new IdentifierIsAlreadyDeclared(identifier.Name, identifier.SourceContext));
                }

                if (initializedInBlock != null)
                {
                    table.InitializeInBlock(identifier, initializedInBlock);
                }
            }
            else
            {
                if (!table.CheckIdentifier(identifier.Name))
                {
                    ReportError(new IdentifierIsNotDeclared(identifier.Name, identifier.SourceContext));
                }
                else
                {
                    TableIdentifier tableIdentifier = table.FetchIdentifier(identifier.Name);
                    identifier.Type = tableIdentifier.Type;
                    //check for initialization in this block
                    if (!table.IsInitializedInBlock(identifier, initializedInBlock) && checkInit && !tableIdentifier.InitializedGlobally)
                    {
                        ReportError(new IdentifierIsNotInitialized(identifier.Name, identifier.SourceContext));
                    }
                }
            }
        }
Пример #3
0
 public static void ResolveAdressor(Expression adressor, EmbeddedStatement body, Table.Table table)
 {
     if (adressor is IdentifierExpression)
     {
         ResolveIdentifierExpression((IdentifierExpression)adressor, table, body, false);
         TableIdentifier tableIdentifier = table.FetchIdentifier(((IdentifierExpression)adressor).Name);
         if (tableIdentifier != null && tableIdentifier.IsGlobal)
         {
             tableIdentifier.InitializedGlobally = true;
         }
         else
         {
             table.InitializeInBlock((IdentifierExpression)adressor, body);
         }
     }
     else
     {
         ResolveArrayElement((ArrayElementExpression)adressor, table, true);
     }
 }
Пример #4
0
        public static void ResolveAssignmentStatement(AssignmentStatement assignment, Table.Table table)
        {
            EmbeddedStatement body = (EmbeddedStatement)assignment.GetParentByType(typeof(EmbeddedStatement));

            ResolveExpression(assignment.AdressableExpression, table);

            if (assignment.AdressorExpressions.Length > 1)
            {
                foreach (IdentifierExpression identifier in assignment.AdressorExpressions)
                {
                    ResolveIdentifierExpression(identifier, table, body);
                    TableIdentifier tableIdentifier = table.FetchIdentifier(identifier.Name);
                    if (tableIdentifier.IsGlobal)
                    {
                        tableIdentifier.InitializedGlobally = true;
                    }
                }
            }
            else
            {
                ResolveAdressor(assignment.AdressorExpressions[0], body, table);
            }
        }