示例#1
0
 static void ParseExtensions(TokenReader tr)
 {
     //extensions 100 to max;
     tr.ReadNext(); //100
     tr.ReadNextOrThrow("to");
     tr.ReadNext(); //number or max
     tr.ReadNextOrThrow(";");
 }
示例#2
0
        static void ParseMessages(TokenReader tr, ProtoCollection p)
        {
            string package = "Example";

            while (true)
            {
                string token = tr.ReadNext();
                if (ParseComment(token))
                {
                    continue;
                }

                try
                {
                    switch (token)
                    {
                    case ";":
                        lastComment.Clear();
                        continue;

                    case "message":
                        ParseMessage(tr, p, package);
                        break;

                    case "enum":
                        ParseEnum(tr, p, package);
                        break;

                    case "option":
                        //Save options
                        ParseOption(tr, p);
                        break;

                    case "import":     //Ignored
                        tr.ReadNext();
                        tr.ReadNextOrThrow(";");
                        break;

                    case "package":
                        package = tr.ReadNext();
                        tr.ReadNextOrThrow(";");
                        break;

                    case "extend":
                        ParseExtend(tr, p, package);
                        break;

                    default:
                        throw new ProtoFormatException("Unexpected/not implemented: " + token, tr);
                    }
                } catch (EndOfStreamException)
                {
                    throw new ProtoFormatException("Unexpected EOF", tr);
                }
            }
        }
示例#3
0
        static void ParseEnumValueOptions(TokenReader tr, ProtoEnumValue evalue)
        {
            while (true)
            {
                string key = tr.ReadNext();
                tr.ReadNextOrThrow("=");
                string val = tr.ReadNext();

                ParseEnumValueOptions(key, val, evalue);
                string optionSep = tr.ReadNext();
                if (optionSep == "]")
                    break;
                if (optionSep == ",")
                    continue;
                throw new ProtoFormatException(@"Expected "","" or ""]"" got " + tr.NextCharacter, tr);
            }
            tr.ReadNextOrThrow(";");
        }
示例#4
0
        static void ParseFieldOptions(TokenReader tr, Field f)
        {
            while (true)
            {
                string key = tr.ReadNext();
                tr.ReadNextOrThrow("=");
                string val = tr.ReadNext();

                ParseFieldOption(key, val, f);
                string optionSep = tr.ReadNext();
                if (optionSep == "]")
                {
                    break;
                }
                if (optionSep == ",")
                {
                    continue;
                }
                throw new ProtoFormatException(@"Expected "","" or ""]"" got " + tr.NextCharacter, tr);
            }
            tr.ReadNextOrThrow(";");
        }
示例#5
0
        static void ParseEnumValueOptions(TokenReader tr)
        {
            while (true)
            {
                string key = tr.ReadNext();
                tr.ReadNextOrThrow("=");
                string val = tr.ReadNext();
                Debug.WriteLine($"{key} = {val}");

                string optionSep = tr.ReadNext();
                if (optionSep == "]")
                {
                    break;
                }

                if (optionSep == ",")
                {
                    continue;
                }

                throw new ProtoFormatException(@"Expected "","" or ""]"" got " + tr.NextCharacter, tr);
            }
            tr.ReadNextOrThrow(";");
        }
示例#6
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);
        }
示例#7
0
        static void ParseImport(TokenReader tr, ProtoCollection collection)
        {
            string path         = tr.ReadNext();
            bool   publicImport = path == "public";

            if (publicImport)
            {
                path = tr.ReadNext();
            }
            tr.ReadNextOrThrow(";");

            if (publicImport)
            {
                collection.ImportPublic.Add(path);
            }
            else
            {
                collection.Import.Add(path);
            }
        }
示例#8
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);
        }
示例#9
0
        static void ParseFieldOptions(TokenReader tr, Field f)
        {
            while (true)
            {
                string key = tr.ReadNext();
                tr.ReadNextOrThrow("=");
                string val = tr.ReadNext();

                ParseFieldOption(key, val, f);
                string optionSep = tr.ReadNext();
                if (optionSep == "]")
                    break;
                if (optionSep == ",")
                    continue;
                throw new ProtoFormatException(@"Expected "","" or ""]"" got " + tr.NextCharacter, tr);
            }
            tr.ReadNextOrThrow(";");
        }
示例#10
0
        static bool ParseField(TokenReader tr, ProtoMessage m)
        {
            string rule = tr.ReadNext();
            while (true)
            {
                if (ParseComment(rule) == false)
                    break;
                rule = tr.ReadNext();
            }

            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, m);
                    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 = int.Parse(tr.ReadNext());
            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;
        }
示例#11
0
 static void ParseExtensions(TokenReader tr, ProtoMessage m)
 {
     //extensions 100 to max;
     tr.ReadNext(); //100
     tr.ReadNextOrThrow("to");
     tr.ReadNext(); //number or max
     tr.ReadNextOrThrow(";");
 }
示例#12
0
        static void ParseMessages(TokenReader tr, ProtoCollection p)
        {
            string package = "Example";

            while (true)
            {
                string token = tr.ReadNextComment();
                if (ParseComment(token))
                {
                    continue;
                }

                try
                {
                    switch (token)
                    {
                    case ";":
                        break;

                    case "message":
                        ParseMessage(tr, p, package);
                        break;

                    case "enum":
                        ParseEnum(tr, p, package);
                        break;

                    case "option":
                        //Save options
                        ParseOption(tr, p);
                        break;

                    case "import":
                        ParseImport(tr, p);
                        break;

                    case "package":
                        package = tr.ReadNext();
                        tr.ReadNextOrThrow(";");
                        break;

                    case "syntax":     //This is not a supported protobuf keyword, used in Google internally
                        tr.ReadNextOrThrow("=");
                        tr.ReadNext();
                        tr.ReadNextOrThrow(";");
                        break;

                    case "extend":
                        ParseExtend(tr, p, package);
                        break;

                    default:
                        throw new ProtoFormatException("Unexpected/not implemented: " + token, tr);
                    }
                    lastComment.Clear();
                }
                catch (EndOfStreamException)
                {
                    throw new ProtoFormatException("Unexpected EOF", tr);
                }
            }
        }
示例#13
0
        static void ParseMessages(TokenReader tr, ProtoCollection p)
        {
            string package = "Example";

            while (true)
            {
                string token = tr.ReadNext();
                if (ParseComment(token))
                    continue;

                try
                {
                    switch (token)
                    {
                        case "message":
                            ParseMessage(tr, p, package);
                            break;
                        case "enum":
                            ParseEnum(tr, p, package);
                            break;
                        case "option":
                        //Save options
                            ParseOption(tr, p);
                            break;
                        case "import": //Ignored
                            tr.ReadNext();
                            tr.ReadNextOrThrow(";");
                            break;
                        case "package":
                            package = tr.ReadNext();
                            tr.ReadNextOrThrow(";");
                            break;
                        default:
                            throw new ProtoFormatException("Unexpected/not implemented: " + token, tr);
                    }
                } catch (EndOfStreamException)
                {
                    throw new ProtoFormatException("Unexpected EOF", tr);
                }
            }
        }
示例#14
0
        static void ParseImport(TokenReader tr, ProtoCollection collection)
        {
            string path = tr.ReadNext();
            bool publicImport = path == "public";
            if (publicImport)
                path = tr.ReadNext();
            tr.ReadNextOrThrow(";");

            if (publicImport)
                collection.ImportPublic.Add(path);
            else
                collection.Import.Add(path);
        }
示例#15
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);
        }
示例#16
0
        static void ParseMessages(TokenReader tr, ProtoCollection p)
        {
            string package = "Example";

            while (true)
            {
                string token = tr.ReadNext();
                if (ParseComment(token))
                    continue;

                try
                {
                    switch (token)
                    {
                        case ";":
                            lastComment.Clear();
                            continue;
                        case "message":
                            ParseMessage(tr, p, package);
                            break;
                        case "enum":
                            ParseEnum(tr, p, package);
                            break;
                        case "option":
                            //Save options
                            ParseOption(tr, p);
                            break;
                        case "import": //Ignored
                            tr.ReadNext();
                            tr.ReadNextOrThrow(";");
                            break;
                        case "package":
                            package = tr.ReadNext();
                            tr.ReadNextOrThrow(";");
                            break;
                        case "syntax": //This is not a supported protobuf keyword, used in Google internally
                            tr.ReadNextOrThrow("=");
                            tr.ReadNext();
                            tr.ReadNextOrThrow(";");
                            break;
                        case "extend":
                            ParseExtend(tr, p, package);
                            break;
                        default:
                            throw new ProtoFormatException("Unexpected/not implemented: " + token, tr);
                    }
                }
                catch (EndOfStreamException)
                {
                    throw new ProtoFormatException("Unexpected EOF", tr);
                }
            }
        }
示例#17
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);
        }