コード例 #1
0
 public ASTCILIOInStringNode(CoolMethod method, ILabelILGenerator labelIlGenerator) : base(labelIlGenerator.GenerateFunc(Types.IO, Functions.InString), method,
                                                                                           Enumerable.Empty <ASTCILExpressionNode>())
 {
 }
コード例 #2
0
        public MipsProgram VisitType(ASTCILTypeNode Type)
        {
            var result = new MipsProgram();

            foreach (var method in Type.Methods)
            {
                result += method.Accept(this);
            }

            var typeName        = Type.Type.Name;
            var typeNameParent  = Type.Type.Parent?.Name;
            var label_type_name = labelGenerator.GenerateLabelTypeName(typeName);

            result.SectionData.Append(MipsGenerationHelper.NewScript()
                                      .AddData(label_type_name.value, new[]
            {
                MipsGenerationHelper.AddStringData(typeName)
            }));
            result.SectionData.Append(MipsGenerationHelper.NewScript()
                                      .AddData(label_type_name.@object, new[]
            {
                MipsGenerationHelper.AddIntData(label_type_name.value),
                MipsGenerationHelper.AddIntData(typeName.Length)
            }));

            var label_virtual_table = labelGenerator.GenerateLabelVirtualTable(typeName);

            result.SectionData.Append(MipsGenerationHelper.NewScript()
                                      .AddData(label_virtual_table,
                                               Type.VirtualTable.Select(x =>
                                                                        MipsGenerationHelper.AddIntData(labelGenerator.GenerateFunc(x.Type.Name, x.Name)))));

            var typeInfo_label        = labelGenerator.GenerateLabelTypeInfo(typeName);
            var typeInfo_label_parent = typeNameParent != null?labelGenerator.GenerateLabelTypeInfo(typeNameParent) : labelGenerator.GenerateVoid();

            result.SectionData.Append(MipsGenerationHelper.NewScript()
                                      .AddData(typeInfo_label, new[]
            {
                MipsGenerationHelper.AddIntData(label_type_name.@object),
                MipsGenerationHelper.AddIntData(Type.Type.AllocateSize),
                MipsGenerationHelper.AddIntData(label_virtual_table),
                MipsGenerationHelper.AddIntData(typeInfo_label_parent)
            }));

            result.SectionDataGlobals.Append(MipsGenerationHelper.NewScript().GlobalSection(label_type_name.value)
                                             .GlobalSection(label_type_name.@object)
                                             .GlobalSection(label_virtual_table).GlobalSection(typeInfo_label));

            return(result);
        }
 public ASTCILObjectTypeNameNode(CoolMethod method, ILabelILGenerator labelIlGenerator) : base(
         labelIlGenerator.GenerateFunc(Types.Object, Functions.Type_Name), method, Enumerable.Empty <ASTCILExpressionNode>())
 {
 }
コード例 #4
0
 public ASTCILStringConcatNode(CoolMethod method, ILabelILGenerator labelIlGenerator) : base(
         labelIlGenerator.GenerateFunc(Types.String, Functions.Concat), method, Enumerable.Empty <ASTCILExpressionNode>())
 {
 }
 public ASTCILIOInIntNode(CoolMethod coolMethod, ILabelILGenerator labelgenerator) : base(labelgenerator.GenerateFunc(Types.IO, Functions.InInt), coolMethod,
                                                                                          Enumerable.Empty <ASTCILExpressionNode>())
 {
 }