void ParseMessage(FileNode filenode) { var node = new MessageNode(); // message的头注释 ParseCommentAndEOL(node); Consume(TokenType.Message); MarkLocation(node); node.Name = FetchToken(TokenType.Identifier, "require message type name").Value; _tool.CheckDuplicate(node.Loc, filenode.Package, node.Name); filenode.AddMessage(node); _fileNode.AddSymbol(filenode.Package, node.Name, node); TryConsume(TokenType.EOL); ParseCommentAndEOL(node); Consume(TokenType.LBrace); TryConsume(TokenType.EOL); while (CurrToken.Type != TokenType.RBrace) { ParseCommentAndEOL(node); // 内嵌枚举 while (CurrToken.Type == TokenType.Enum) { _fileNode.EnterScope(); ParseEnum(filenode, node); _fileNode.LeaveScope(); ParseCommentAndEOL(node); } if (CurrToken.Type == TokenType.RBrace) { break; } ParseField(filenode, node); } Consume(TokenType.RBrace); TryConsume(TokenType.EOL); FillFieldNumber(node); }