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)); } }
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)); } } } }
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); } }
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); } }