public override void Visit(FieldAssignmentStatementNode node)
        {
            try
            {
                node.classIdentifier.Accept(this);
                if (!AreTypeCompatible(LookupSymbolType(node.classIdentifier.name).GetType(), typeof(ClassType)))
                    throw new Exception("Object used for field access is not an instance of any Class");

                FieldDefinition fieldDefinitionOfClass = Analysis.Environment.LookupFieldInClass(node.classIdentifier.name, ClassBeingVisited);
                ClassDefinition classDefinition = Analysis.Environment.Classes.Lookup(fieldDefinitionOfClass.FieldType.Name);
                FieldDefinition fieldDefinition;

                try
                {
                    fieldDefinition = Analysis.Environment.LookupFieldInClass(node.fieldIdentifier.name, classDefinition);
                }
                catch (Exception)
                {
                    throw new Exception("Field '" + node.fieldIdentifier.name + "' not found in class '" + node.classIdentifier.name + "'");
                }

                node.assignExpression.Accept(this);

                if (!AreTypeCompatible(node.assignExpression.ExpressionType.GetType(), fieldDefinition.FieldType.GetType()))
                    throw new Exception("Uncompatible types in assignment statement");
            }
            catch (Exception e)
            {
                Analysis.LogSemanticError(e.Message, node.lineNumber);
            }
        }
 public override void Visit(FieldAssignmentStatementNode node)
 {
     node.classIdentifier.Accept(this);
     FieldDefinition fieldDefinitionOfClass = Analysis.Environment.LookupFieldInClass(node.classIdentifier.name, ClassBeingVisited);
     ClassDefinition classDefinition = Analysis.Environment.Classes.Lookup(fieldDefinitionOfClass.FieldType.Name);
     FieldDefinition fieldDefinition = Analysis.Environment.LookupFieldInClass(node.fieldIdentifier.name, classDefinition);
     Gen("lea", "eax", "[eax+" + fieldDefinition.Location.ToString() + "]", "Accessing field " + classDefinition.Name + "." + fieldDefinition.Name + "()");
     Gen("push", "eax");
     node.assignExpression.Accept(this);
     Gen("pop", "edx");
     Gen("mov", "[edx]", "eax");
 }
Exemple #3
0
 public virtual void Visit(FieldAssignmentStatementNode node)
 {
     node.classIdentifier.Accept(this);
     node.fieldIdentifier.Accept(this);
     node.assignExpression.Accept(this);
 }