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"); }
public virtual void Visit(FieldAssignmentStatementNode node) { node.classIdentifier.Accept(this); node.fieldIdentifier.Accept(this); node.assignExpression.Accept(this); }