Beispiel #1
0
        public void DeclareEnum(miranaParser.Stat_enumdeclContext context)
        {
            string enumName      = context.name().GetText();
            bool   isFlag        = context.FLAG() != null;
            var    enumFieldList = context.enumBody()?.enumEntryBody()?.enumEntry() ?? Array.Empty <miranaParser.EnumEntryContext>();

            ContextEnumType = new(enumName, isFlag, compileUnit.Compiler.GetNextTypeId());
            BigInteger lastEnumEntryValue = 0;

            void RecordEnumField(miranaParser.EnumEntryContext context)
            {
                string fieldName = context.enumField().GetText();

                if (context.enumFieldExp() != null)
                {
                    var enumValue = EvaluateExpression(context.enumFieldExp());
                    if (!isFlag && !IsSingleExpression(context.enumFieldExp()))
                    {
                        compileUnit.AddError(context, 10, $"bitwise operators can only apply on enum flag");
                    }
                    ContextEnumType[fieldName] = enumValue;
                    if (!isFlag)
                    {
                        lastEnumEntryValue = enumValue;
                    }
                }
                else
                {
                    if (isFlag)
                    {
                        if (lastEnumEntryValue == 0)
                        {
                            lastEnumEntryValue = 1;
                        }
                        else
                        {
                            lastEnumEntryValue <<= 1;
                        }
                        ContextEnumType[fieldName] = lastEnumEntryValue;
                    }
                    else
                    {
                        ContextEnumType[fieldName] = ++lastEnumEntryValue;
                    }
                }
            }

            enumFieldList.ForEach(RecordEnumField);
            compileUnit.Compiler.AddType(context, ContextEnumType);
        }
 private partial void WriteStat_EnumDecl(miranaParser.Stat_enumdeclContext context);