Пример #1
0
        static void ParseEnum(TokenReader tr, ProtoMessage parent, string package)
        {
            ProtoEnum me = new ProtoEnum(parent, package);

            LocalParser.ParseComments(me, lastComment, tr);
            me.ProtoName = tr.ReadNext();

            parent.Enums.Add(me.ProtoName, me); //must be after .ProtoName is read

            if (tr.ReadNext() != "{")
                throw new ProtoFormatException("Expected: {", tr);
            
            while (true)
            {
                string name = tr.ReadNext();

                if (ParseComment(name))
                    continue;
                
                if (name == "}")
                    return;
                
                //Ignore options
                if (name == "option")
                {
                    ParseOption(tr, null);
                    lastComment.Clear();
                    continue;
                }

                ParseEnumValue(tr, me, name);
            }
            
        }
Пример #2
0
        static void ParseMessage(TokenReader tr, ProtoMessage parent, string package)
        {
            var msg = new ProtoMessage(parent, package);
            LocalParser.ParseComments(msg, lastComment, tr);
            msg.ProtoName = tr.ReadNext();

            tr.ReadNextOrThrow("{");

            try
            {
                while (ParseField (tr, msg))
                    continue;
            } catch (Exception e)
            {
                throw new ProtoFormatException(e.Message, e, tr);
            }

            parent.Messages.Add(msg.ProtoName, msg);
        }
Пример #3
0
        static void ParseExtend(TokenReader tr, ProtoMessage parent, string package, IEnumerable <string> imports)
        {
            var msg = new ProtoMessage(parent, package, imports);

            LocalParser.ParseComments(msg, lastComment, tr);
            msg.ProtoName = tr.ReadNext();

            tr.ReadNextOrThrow("{");

            try
            {
                while (ParseField(tr, msg, imports))
                {
                    continue;
                }
            }
            catch (Exception e)
            {
                throw new ProtoFormatException(e.Message, e, tr);
            }

            //Not implemented
            //parent.Messages.Add(msg.ProtoName, msg);
        }
Пример #4
0
        static bool ParseField(TokenReader tr, ProtoMessage m)
        {
            string rule = tr.ReadNextComment();

            while (ParseComment(rule))
            {
                rule = tr.ReadNextComment();
            }

            Field f = new Field(tr);

            //Rule
            switch (rule)
            {
            case ";":
                lastComment.Clear();
                return(true);

            case "}":
                lastComment.Clear();
                return(false);

            case "required":
                f.Rule = FieldRule.Required;
                break;

            case "optional":
                f.Rule = FieldRule.Optional;
                break;

            case "repeated":
                f.Rule = FieldRule.Repeated;
                break;

            case "option":
                //Save options
                ParseOption(tr, m);
                return(true);

            case "message":
                ParseMessage(tr, m, m.Package + "." + m.ProtoName);
                return(true);

            case "enum":
                ParseEnum(tr, m, m.Package + "." + m.ProtoName);
                return(true);

            case "extensions":
                ParseExtensions(tr);
                return(true);

            default:
                throw new ProtoFormatException("unknown rule: " + rule, tr);
            }

            //Field comments
            LocalParser.ParseComments(f, lastComment, tr);

            //Type
            f.ProtoTypeName = tr.ReadNext();

            //Name
            f.ProtoName = tr.ReadNext();

            //ID
            tr.ReadNextOrThrow("=");
            f.ID = ParseInt(tr);
            if (19000 <= f.ID && f.ID <= 19999)
            {
                throw new ProtoFormatException("Can't use reserved field ID 19000-19999", tr);
            }

            if (f.ID > (1 << 29) - 1)
            {
                throw new ProtoFormatException("Maximum field id is 2^29 - 1", tr);
            }

            //Add Field to message
            m.Fields.Add(f.ID, f);

            //Determine if extra options
            string extra = tr.ReadNext();

            if (extra == ";")
            {
                return(true);
            }

            //Field options
            if (extra != "[")
            {
                throw new ProtoFormatException("Expected: [ got " + extra, tr);
            }

            ParseFieldOptions(tr, f);
            return(true);
        }