예제 #1
0
        protected override void VisitClassDefinition(ClassDefinitionNode classDefinitionNode)
        {
            string      className   = classDefinitionNode.NameNode.Value;
            ClassSymbol classSymbol = new ClassSymbol(className, classDefinitionNode);

            AddSymbol(classSymbol);
            Visit(classDefinitionNode.AttributeNodes);
        }
        protected override void VisitClassDefinition(ClassDefinitionNode node)
        {
            string classNameUpper = node.NameNode.Value.ToUpper();
            int    offset         = 0;

            if (Class2Offset.ContainsKey(classNameUpper))
            {
                offset = Class2Offset[classNameUpper];
            }

            int size = 0;

            foreach (DeclarationNode attributeNode in node.AttributeNodes)
            {
                if (attributeNode.Symbol is AttributeSymbol attributeSymbol)
                {
                    attributeSymbol.Offset = offset + size;
                }

                if (attributeNode is VarArrayDeclarationNode varArrayDeclarationNode)
                {
                    NodeValue arraySizeValue = varArrayDeclarationNode.ArraySizeValue;
                    if (arraySizeValue is IntValue intValue)
                    {
                        size += (attributeNode.Symbol.BuiltinType == SymbolType.String ? 20 : 4) * Convert.ToInt32(intValue.Value);
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    size += (attributeNode.Symbol.BuiltinType == SymbolType.String ? 20 : 4);
                }
            }


            if (node.Symbol is ClassSymbol classSymbol)
            {
                classSymbol.Offset          = offset;
                classSymbol.Size            = size;
                classSymbol.AttributesCount = node.AttributeNodes.Count;
            }



            if (Class2RequiredSize.ContainsKey(classNameUpper))
            {
                long requiredSize = Class2RequiredSize[classNameUpper];
                if (size != requiredSize)
                {
                    node.Annotations.Add(new WrongClassSizeError(node.NameNode.Location, node.NameNode.Value, size, requiredSize));
                }
            }
        }
예제 #3
0
 protected virtual T VisitClassDefinition(ClassDefinitionNode node)
 {
     Visit(node.AttributeNodes);
     return(DefaultResult);
 }
 protected virtual void VisitClassDefinition(ClassDefinitionNode node)
 {
     Visit(node.AttributeNodes);
 }